MySQL计数匹配列

时间:2014-04-17 06:48:49

标签: 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行

3 个答案:

答案 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

DEMO

您需要使用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
相关问题