我在使用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行。
答案 0 :(得分:2)
加入表而不是使用子查询。
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
,因此每次只计算所有用户。
答案 1 :(得分:1)
你可以在表达式中使用join和SUM()
,使用带表达式的sum会根据表达式结果将其计算为布尔值1或0,因此它将作为计数使用
SELECT u.id,
SUM(uc.`type`='clothes') count_clothes
FROM users u
LEFT JOIN user_clothes uc ON(u.id =uc.user_id)
GROUP BY u.id
ORDER BY count_clothes;
如果您仍然想要使用子查询,则需要将其用作与共同相关的子查询,但有时它缺乏性能,因此不推荐使用
SELECT t1.name, (
SELECT COUNT(*) FROM t2 WHERE type = 'clothes' AND t1.id=user_id
) as count_clothes
FROM users t1
ORDER BY count_clothes;
答案 2 :(得分:1)
试试这个
SELECT t1.name,
IFNULL(count(t2.userid),0) AS count_clothes
FROM t1
LEFT JOIN t2 ON t1.id=t2.userid
WHERE t2.type="clothes"
GROUP BY t2.userid