我在 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
您需要使用LEFT JOIN
而不是INNER JOIN
才能获得零衣服的用户。而且您必须计算 t2.userid
而不是 COUNT(*)
,这样它就不会计算空匹配。
子查询的问题是 WHERE
子句没有选择特定的 userid
,因此它每次都只计算所有用户。
关于MySQL 计数匹配列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23126375/