MySQL:按隐式分组计数

MySQL:按隐式分组计数,mysql,count,group-by,distinct,Mysql,Count,Group By,Distinct,一段时间以来,我一直在猜测如何解决我的问题,但我似乎找不到解决方案,所以我来找你们,专家们 我所拥有的 具有以下结构和值的MySQL表(作为示例): 我需要什么 我希望通过查询返回至少有一个属性名为“action”且属性值为“call”且按“person”分组但仅计算其中一个的项目(项目id) 因此,如果像在示例中一样,在id 8和11处,有一个带有两个“action”=“call”的item_id,则只有COUNT其中一个 查询应返回如下内容: +--------+--------------

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

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

我需要什么 我希望通过查询返回至少有一个属性名为“action”且属性值为“call”且按“person”分组但仅计算其中一个的项目(项目id)

因此,如果像在示例中一样,在id 8和11处,有一个带有两个“action”=“call”的item_id,则只有
COUNT
其中一个

查询应返回如下内容:

+--------+--------------+
| person | action_calls |
+--------+--------------+
| Joseph |            2 |
| Mike   |            1 |
+--------+--------------+
问题 问题是,我不知道如何用一种简单的方法来实现这一点,而这种方法不会带来巨大的性能提升,因为这个查询将返回并搜索很多行,在某些情况下也会返回很多行

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

如果我让一个
计数(不同)
,它只在'Joseph'中返回'1',因为该值总是'call',如果我
按b.item\u id分组
,它会返回两行Joseph(在这种情况下,它也会同时计算'call'属性,因此它也不是解决方案)

我试过的 我尝试的查询如下:

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子句中选择,因为有效的项位于另一个表中(就像父子表一样)。家长id号只是一个示例,并不相关

总结 如何在MySQL中使
COUNT
countgroupby
一样运行,而不嵌套
SELECT
s,从而降低性能

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

此外,任何关于查询提高性能所需信息的其他方法的建议都将受到欢迎

谢谢大家的时间和帮助

亲切问候。

试试这个

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;
:)

试试这个

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;
:)

试试这个

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;
:)

试试这个

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;
:)

编辑:

编辑:

编辑:

编辑:



人和你的桌子之间的关系在哪里?没有关系。它只是项所具有的属性的值。这纯粹是一个文本字段。这个关系是在查询中建立的,带有“a.attribute_name='person'”。是的,现在就得到它。duh@Strawberry哪一个,什么我不太确定。我认为,如果可以有多个呼叫与同一个人关联,那么这些呼叫应该保存在一个单独的表中。个人和您的表之间的关系在哪里?没有关系。它只是项所具有的属性的值。这纯粹是一个文本字段。这个关系是在查询中建立的,带有“a.attribute_name='person'”。是的,现在就得到它。duh@Strawberry哪一个,什么我不太确定。我认为,如果可以有多个呼叫与同一个人关联,那么这些呼叫应该保存在一个单独的表中。个人和您的表之间的关系在哪里?没有关系。它只是项所具有的属性的值。这纯粹是一个文本字段。这个关系是在查询中建立的,带有“a.attribute_name='person'”。是的,现在就得到它。duh@Strawberry哪一个,什么我不太确定。我认为,如果可以有多个呼叫与同一个人关联,那么这些呼叫应该保存在一个单独的表中。个人和您的表之间的关系在哪里?没有关系。它只是项所具有的属性的值。这纯粹是一个文本字段。这个关系是在查询中建立的,带有“a.attribute_name='person'”。是的,现在就得到它。duh@Strawberry哪一个,什么我不太确定。我认为如果同一个人可以有多个电话,那么这些电话应该放在一个单独的表中。。。它起作用了!!虽然性能较慢,但似乎工作正常。我认为答案是正确的,但如果有人找到其他方法来提高性能,请发表评论!谢谢大家的时间和回答!虽然这个答案也很完美,但我认为@草莓的答案是正确的,因为这个答案的性能更好。但是,如果可以,我会把两个答案都标为正确!!再次感谢您的时间和耐心!嗯。。。它起作用了!!虽然性能较慢,但似乎工作正常。我认为答案是正确的,但如果有人找到其他方法来提高性能,请发表评论!谢谢大家的时间和回答!虽然这个答案也很完美,但我认为@草莓的答案是正确的,因为这个答案的性能更好。但是,如果可以,我会把两个答案都标为正确!!再次感谢您的时间和耐心!嗯。。。它起作用了!!虽然性能较慢,但似乎工作正常。我认为答案是正确的,但如果有人找到其他方法来提高性能,请发表评论!谢谢大家的时间和回答!虽然这个答案也很完美,但我认为@草莓的答案是正确的,因为这个答案的性能更好。但是,如果可以,我会把两个答案都标为正确!!再次感谢您的时间和耐心!嗯。。。它起作用了!!虽然性能较慢,但似乎工作正常。我认为答案是正确的,但如果有人找到其他方法来提高性能,请发表评论!谢谢大家的时间和回答!虽然这个答案也很完美,但我认为@草莓的答案是正确的,因为这个答案的性能更好。但是,如果可以,我会把两个答案都标为正确!!再次感谢您的时间和耐心!是的,这是我在写“如果我按b.item_id分组,它会返回两行Joseph,其中一行有两个计数,wh