【问题标题】:How to display unique data with MySQL which is inserted by same and multiple users?如何使用 MySQL 显示由相同和多个用户插入的唯一数据?
【发布时间】: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


【解决方案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;

注意事项:

  • 按访客/用户 ID 聚合以获取最新条目(基于 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;

【讨论】:

  • 谢谢,但正如我在描述中所写,没有“item_id=7777”怎么办。我想对所有项目做同样的事情。