MySQL 计数匹配列

标签 mysql count subquery

我在 MySQL 中使用多个表的子查询和 COUNT() 时遇到问题。

例如,我有两个表:

t1

id | name
42 | John
22 | Mary
77 | Nick

t2

userid | merchandise | type
  22   |    Skirt    | clothes
  22   |    Scarf    | clothes
  22   |    Purse    | clothes
  77   |    Grill    | home
  22   |    Pen      | office
  42   |    Jacket   | clothes

我想使用两个表来计算表 2 中的类型。例如,所需的输出将是:

每位用户购买的衣服数量

name | count_clothes
Mary | 3
John | 1
Nick | 0

到目前为止我想出的最好的 MySQL 查询是:

SELECT t1.name, (
    SELECT COUNT(*) FROM t2 WHERE type = 'clothes'
) as count_clothes
FROM users
ORDER BY count_clothes;

但它给我的输出是:

name | count_clothes
Mary | 3
John | 3
Nick | 3

我知道缺陷是我的 COUNT() 查询。我已尝试匹配 ID 列,但它不断返回错误,指出子查询返回超过 1 行

最佳答案

连接表而不是使用子查询。

SELECT t1.name, IFNULL(COUNT(t2.userid), 0) AS count_clothes
FROM users t1
LEFT JOIN t2 ON t1.id = t2.userid and t2.type = 'clothes'
GROUP BY t1.name
ORDER BY count_clothes DESC

DEMO

您需要使用LEFT JOIN而不是INNER JOIN才能获得零衣服的用户。而且您必须计算 t2.userid 而不是 COUNT(*),这样它就不会计算空匹配。

子查询的问题是 WHERE 子句没有选择特定的 userid,因此它每次都只计算所有用户。

关于MySQL 计数匹配列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23126375/

相关文章:

mysql - 如何在一个数据库请求中计算不同的 mysql 行?

SQL count 连接不同的多列

excel - 需要 header 在备注中包含计数和连接

mysql - MySql 中的 LIMIT 子句似乎不适用于 IN() 子查询

需要 mySQL 子选择

postgresql - 具有来自可选子查询的多个返回值的 INSERT

PHP Mysql查看PDF文件报错

php - 在symfony2的entites文件夹中保持表的相同名称

c# - 我需要在 MySQL 中使用事务对象吗

mysql - NOT IN 的奇怪行为