- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一段时间以来,我一直在尝试猜测如何解决我的问题,但我似乎找不到解决方案,所以我来找你,专家们。
具有以下结构和值的 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/
我是一名优秀的程序员,十分优秀!