【问题标题】:MySQL Count Matching ColumnMySQL 计数匹配列
【发布时间】:2014-04-17 06:48:48
【问题描述】:

我在 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 中的 types。因此,例如,所需的输出将是:

为每位用户购买的衣服数量

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 行

【问题讨论】:

  • 您的子查询中没有 WHERE 子句,所以它会计算所有内容。

标签: mysql count subquery


【解决方案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

DEMO

您需要使用LEFT JOIN 而不是INNER JOIN 才能让用户获得零衣服。而且你必须计算 t2.userid 而不是 COUNT(*) 所以它不会计算空匹配。

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

【讨论】:

  • 我认为它不起作用,因为它产生像Nick=1 这样的结果,所以它的wrong one..
  • 修好了,我把COUNT(*)改成了COUNT(t2.userid)
  • 是的,现在它看起来不错,也检查一下@user2902009,并获取(+1) 以获得有用的answerupdate
【解决方案2】:

您可以将 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;

【讨论】:

  • 现在很好用。你能提供一些关于 JOINING 表的优秀资源吗?
  • @user2902009 我学到了很多的重要资源是 stackoverflow :) 查看过去的答案 mysql tag 或任何其他与数据库相关的标签,您将学习所有专家知识
【解决方案3】:

试试这个

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

【讨论】:

  • 它几乎可以工作......但是否可以为其他用户计算“零”?
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2023-03-07
相关资源
最近更新 更多