mysql join可以消除重复

时间:2014-08-05 22:48:17

标签: mysql group-by

我有一个表'sharelist',其中包含以下字段:

  senderID
  recipientID
  senderComment
  recipientComment
  viewed
  linkID

所有字段都是整数。

表中的每个条目表示两个用户之间共享的项目。

linkID是两个用户之间共享的内容。

senderID是发起共享的用户的ID,而对于recipientID则相反。

senderComment是发件人编写的评论数,但收件人尚未查看。对于recipientComment,情况正好相反。

如果收件人尚未查看共享项目,则

为0,否则为1。

我必须找到所有与用户X相关的新ID链接。这意味着三件事之一是真的

1)senderID = X和recipientComment!= 0(有用户X没有看到他与其他人共享的linkID的评论)

2)recipientID = X和senderComment!= 0(有用户X没有看到其他人与他共享的linkID的评论)

3)recipientID = X并且被观看= 0(有人发送给用户X的链接ID,用户X还没有看到)

此外,由于用户可以与多个人共享相同的linkID,因此将有多个具有相同linkID的条目。对于给定的linkID,查询必须只返回一行。以下查询实现了此

SELECT S.linkID
FROM sharelist S
WHERE (S.senderID=:userID AND S.recipientComment!=0) 
OR (S.recipientID=:userID AND S.senderComment!=0) 
OR (S.recipientID=:userID AND S.viewed=0) 
GROUP BY S.linkID

但是,我想修改此查询,以便之后会出现所有不符合这三个要求的条目。因此,基本上查询将返回一个列表,其中上半部分是“新的”而下半部分是“不是新的”。帮我stackoverflow!

1 个答案:

答案 0 :(得分:1)

在ORDER BY中使用表达式;类似的东西:

  SELECT S.linkID
    FROM sharelist S
   WHERE (S.senderID=:userID OR S.recipientID=:userID) 
GROUP BY S.linkID
ORDER BY SUM(S.recipientID=:userID AND S.viewed=0) DESC,
         SUM(S.recipientID=:userID AND S.senderComment!=0) DESC,
         SUM(S.senderID=:userID AND S.recipientComment!=0) DESC,
         SUM(S.recipientID=:userID) DESC,
         SUM(S.senderID=:userID) DESC

<强>更新

抱歉,我在原始查询中忘记了GROUP BY ..您需要在ORDER BY表达式中聚合结果,见上文。

ORDER BY中的表达式一旦解析后的工作与列值相同,SUM ming条件将返回该条件为真的行数(在这种情况下,true = 1,false = 0)。

查询首先获取所有共享列表行,用户是发件人或收件人,并按linkID对它们进行分组..按顺序按如下顺序排序:

  • 通过用户是收件人且尚未查看共享DESC的行数。
  • 通过用户是收件人且尚未查看发件人评论DESC的行数。
  • 通过用户是发件人且尚未查看收件人评论DESC的行数。
  • 通过用户是收件人DESC的行数。
  • 按用户为发件人DESC的行数计算。

注意,如果两个linkID组在第一个条件计数上匹配,那么它们将按第二个条件计数排序,如果它们再次匹配,则第三个计数......依此类推。 DESC意味着更高的计数首先出现。

我会保留最后一行,我们正在计算行数。

我也猜到了你想要返回你的linkID的顺序..但是你可以随意捣乱它!