MySQL计数匹配列

MySQL计数匹配列,mysql,count,subquery,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 | Pe

我在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行。

您可以对表达式使用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;

您可以对表达式使用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;
试试这个

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
试试这个

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

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

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
而不是
internal-JOIN
,以获得零衣服的用户。您必须计算
t2.userid
而不是
count(*)
,这样它就不会计算空匹配项


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

加入表,而不是使用子查询

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
而不是
internal-JOIN
,以获得零衣服的用户。您必须计算
t2.userid
而不是
count(*)
,这样它就不会计算空匹配项


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

子查询中没有
WHERE
子句,因此它计算所有用户。子查询中没有
WHERE
子句,所以它在计算所有的东西。它几乎起作用了…但是有可能为其他用户计算“零”吗?它几乎起作用了…但是有可能为其他用户计算“零”吗?现在效果很好。你能为我提供一些关于连接表的好资源吗?@user2902009我学到很多的好资源是stackoverflow:)回顾过去的答案或任何其他与数据库相关的标记,你将学习所有的专家knowledge@user2902009现在效果很好。你能为我提供一些关于连接表的好资源吗?@user2902009我学到很多的好资源是stackoverflow:)回顾过去的答案或任何其他与数据库相关的标记,你将学习所有的专家knowledge@user2902009我认为它不起作用,因为它产生的结果像
Nick=1
so,它的
错误的
。修复了它,我将
COUNT(*)改为
COUNT(t2.userid)
。是的,现在它看起来很好,也检查一下这个@user2902009,得到
(+1)
有用的
答案
更新
我认为它不起作用,因为它会产生像
Nick=1
这样的结果,它的
错误的一个
。修复了它,我将
COUNT(*)
更改为
COUNT(t2.userid)
。是的,现在它看起来很好,检查一下这个@user2902009,并获取
(+1)
以获得有用的
答案
更新