gpt4 book ai didi

MySQL:带有隐式 GROUP BY 的 COUNT

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:16 25 4
gpt4 key购买 nike

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

我有什么

具有以下结构和值的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com