MySQL计数匹配列
我在MySQL中使用多个表时遇到子查询和COUNT()问题 例如,我有两个表: t1MySQL计数匹配列,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
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)
以获得有用的答案
和更新