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