【发布时间】:2026-02-01 03:15:02
【问题描述】:
考虑这个表,其中 item_id = 7777 的记录
我想要以这种方式求和项目。
- 例如,前两条记录应视为一条。(两者都是 由 guest_id =1111 插入)。我们将取最后一个 id => 99,“down”值大于“up”值。所以将“向下”增加 1。
- 从 101 到 103,它应该取最后一个(即 103),最后我们有 up = 0,down =12(所以将“down”增加 1,因为在最后一条记录中,“down”值大于 up )
- 最后两条记录是唯一的,具有唯一的 guest_id,并且都具有 up => 1,因此“up”将增加两次。
结果(count_up = 2,count_down = 2)
我写了查询,但我不确定它是否最好和最快。
SELECT COUNT(DISTINCT IF(up > 0, USER, NULL)) AS voters_up, COUNT(DISTINCT IF(down > 0, USER, NULL)) AS voters_down
FROM `items_votes` AS itemA
LEFT JOIN (
SELECT IF(guest_id IS NULL, user_id, guest_id) AS USER, MAX(id) AS id, item_id
FROM items_votes
WHERE item_id = 7777
GROUP BY guest_id,user_id) AS itemB ON itemA.id = itemB.id
WHERE itemA.item_id = 7777
上面的查询并按我的预期返回。
但此查询仅返回一项的唯一总和。如果我删除 item_id 的“where 条件”,查询将不起作用。
如何对所有 item_id 执行相同操作?
请帮助我查询返回所有项目的唯一上述总和。
【问题讨论】:
-
如果你的查询真的有效,它是合理的。
-
但如果我删除 item_id 条件,它适用于我想要对所有 items_id 执行的一个 item_id。那么它就不起作用了。
标签: mysql sql database performance