MySQL:带有隐式 GROUP BY 的 COUNT

标签 mysql count group-by distinct

一段时间以来,我一直在尝试猜测如何解决我的问题,但我似乎找不到解决方案,所以我来找你,专家们。

我有什么

具有以下结构和值的 MySQL 表(作为示例):

+----+---------+----------------+-----------------+--------------+
| id | item_id | attribute_name | attribute_value | deleted_date |
+----+---------+----------------+-----------------+--------------+
|  1 |       2 | action         | call            | NULL         |
|  2 |       2 | person         | Joseph          | NULL         |
|  3 |       2 | action         | fault           | NULL         |
|  4 |       2 | otherattr      | otherval        | NULL         |
|  5 |       5 | action         | call            | NULL         |
|  6 |       5 | person         | Mike            | NULL         |
|  7 |       5 | action         | sprint          | NULL         |
|  8 |       8 | action         | call            | NULL         |
|  9 |       8 | person         | Joseph          | NULL         |
| 10 |       8 | action         | block           | NULL         |
| 11 |       8 | action         | call            | NULL         |
+----+---------+----------------+-----------------+--------------+

我需要什么

我想要一个查询,返回我有多少项目 (item_id) 至少有一个 attribute_name 为“action”,attribute_value 为“call”,按“person”分组,但只计算其中一个。

因此,如果 - 就像在示例中,在 id 8 和 11 - 有一个 item_id 有两个“action”=“call”,只有 COUNT 其中之一。

查询应该返回如下内容:

+--------+--------------+
| person | action_calls |
+--------+--------------+
| Joseph |            2 |
| Mike   |            1 |
+--------+--------------+

问题

问题是我不知道如何以简单的方式做到这一点,这不会带来巨大的性能提升,因为这个查询将返回并搜索很多行 -在某些情况下,也会返回很多。

我唯一想到的是嵌套和嵌套查询,我想避免这种情况。

如果我创建一个COUNT(DISTINCT),它只会在“Joseph”中返回“1”,因为值总是“call”,并且如果我 GROUP BY b.item_id,它会返回两行 Joseph(而且,在这种情况下,它也会计算两个“调用”属性,因此它也不是解决方案)。

我尝试过的

我试过的查询如下:

SELECT a.attribute_value AS person, COUNT(b.attribute_value) AS action_calls  
FROM `er_item_attributes` a, `er_item_attributes` b 
WHERE a.attribute_name = 'person' 
    AND b.item_id IN (SELECT DISTINCT item_id FROM er_item_parents WHERE parent_id IN (1234,4567)) 
    AND b.item_id = a.item_id 
    AND b.attribute_name = 'action' 
    AND b.attribute_value = 'call'
    AND b.deleted_date IS NULL 
GROUP BY a.attribute_value, b.attribute_name

附加信息

如您所见,item_id 也将从内部 WHERE 子句中选择,因为有效的那些在另一个表中(就像父子表一样)。 parent_id 编号仅供引用,无关紧要。

总结

如何让 MySQL 中的 COUNT 表现得像 COUNT GROUP BY 而无需嵌套可能降低性能的 SELECT

如果需要任何进一步的信息,请发表评论,我会尝试添加。

此外,欢迎就查询提高性能所需信息的其他方法提出任何建议。

感谢大家的宝贵时间和帮助!

亲切的问候。

最佳答案

试试这个!

SELECT attribute_value AS person, COUNT(*) FROM `stack_1239` 
WHERE item_id IN (
    SELECT item_id FROM `stack_1239` WHERE attribute_name = 'action' AND attribute_value = 'call'
)
AND attribute_name = 'person'
GROUP BY person;

:)

关于MySQL:带有隐式 GROUP BY 的 COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672135/

相关文章:

Mysql COUNT VS num rows 性能

mysql - 计算数百万行的不同值——适合 NoSQL 吗?

ruby - 如何计算 Ruby 中数组中数组的数量?

java - 难以理解计数和平均值

mysql - GROUP BY 列 HAVING COUNT(*) > 1,仍然显示所有行?

mysql 对单个表中的多组数据求和

sql - MySQL - 限制分组依据

c# - 如何在小巧玲珑中返回原始数据类型的元组

mysql - 插入时十进制值错误 - MySQL

sql - MS Access 中的简单 SQL COUNT 查询