如何使用由同一个和多个用户插入的MySQL显示唯一数据?

时间:2016-11-08 17:07:07

标签: mysql sql database performance

enter image description here

考虑此表,其中包含item_id = 7777

的记录

我想要这样的和物品。

  • 例如,前两个记录应该被视为一个。(两个都是 由guest_id = 1111插入)。我们将采用最后一个id => 99," down"价值大于" up"值。所以递增" down"由1。
  • 从101到103,它应该取最后一个(103),最后我们有= 0,down = 12(所以增量"下降"减1,因为在最后一个记录&#34 ;向下"值大于向上)
  • 最后两条记录是唯一的,具有唯一的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

以上查询并按我的预期返回。

enter image description here

但是此查询仅返回一个项目的唯一总和。如果我删除" where条件"则查询不起作用。 for item_id。

如何为所有item_id执行相同的操作?

请帮我查询返回所有项目的唯一上述金额。

1 个答案:

答案 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;

注意:

  • 这会按来宾/用户ID聚合以获取最新条目(基于ID)。
  • 然后将 inner 连接回原始数据。
  • 每位访客/用户现在有一行,因此不需要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;