考虑此表,其中包含item_id = 7777
的记录我想要这样的和物品。
结果(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
以上查询并按我的预期返回。
但是此查询仅返回一个项目的唯一总和。如果我删除" where条件"则查询不起作用。 for item_id。
如何为所有item_id执行相同的操作?
请帮我查询返回所有项目的唯一上述金额。
答案 0 :(得分:1)
如果您的查询有效,请使用它。我认为这个版本更简单:
SELECT SUM(up > down) as up_votes,
SUM(down > up) as down_votes
FROM items_votes iv JOIN
(SELECT COALESCE(iv2.guest_id, iv2.user_id) as gu_id, MAX(id) as max_id
FROM items_votes iv2
WHERE iv2.item_id = 7777
GROUP BY COALESCE(iv2.guest_id, iv2.user_id)
) iv2
ON iv.id = iv2.max_id;
注意:
count(distinct)
。编辑:
对于所有ID:
SELECT item_id, SUM(up > down) as up_votes,
SUM(down > up) as down_votes
FROM items_votes iv JOIN
(SELECT item_id, COALESCE(iv2.guest_id, iv2.user_id) as gu_id,
MAX(id) as max_id
FROM items_votes iv2
WHERE iv2.item_id = 7777
GROUP BY item_id, COALESCE(iv2.guest_id, iv2.user_id)
) iv2
ON iv.id = iv2.max_id
GROUP BY item_id;