【问题标题】:sql distinct joinsql 不同的连接
【发布时间】:2011-11-26 03:14:49
【问题描述】:

表:

  • 活动:id、userId、description、objectId
  • 用户:ID、姓名
  • usersFriends、id、userId、friendUserId
  • 对象:ID、名称

当前查询:

   SELECT A.*, U.*
   FROM usersFriends UF
   JOIN activities A ON A.userId = UF.friendUserId
   JOIN users U ON U.id = A.userId
   WHERE A.objectId = x

当前查询的问题是,如果用户有匹配的朋友,例如:

  • 用户 1:提姆
  • 用户 2:瑞安
  • 用户 3:艾伦
  • 用户 4:查理

蒂姆是查理的朋友 ryan 和 charlie 是朋友

我们得到了对象 X 的活动,但是我们得到了所有活动的两倍,因为 tim 是 charlie 的朋友,ryan 是 charlie 的朋友,所以我需要某种不同的?

感谢您的帮助!

【问题讨论】:

  • 您使用的是什么版本的 SQL?该查询似乎不适用于任何方言...
  • 哎呀,这是错误的,已修复!
  • @user1066101 - 你为什么要使用UserFriends 表?,看起来你不需要它。还是您只想要与其他用户成为朋友的用户的活动?
  • 你只想要活动(或者你也想要朋友)?如果您显示几个预期的输出行会有所帮助。如果你想要的只是活动,你可以简单地使用 SELECT DISTINCT A.* 来获得不同的活动

标签: sql distinct


【解决方案1】:

我通常这样做... AND A.userId < UF.userId

SELECT A.*, U.*
   FROM usersFriends UF
   JOIN activities A ON A.userId = UF.friendUserId AND A.userId < UF.userId
   JOIN users U ON U.id = A.userId
   WHERE A.objectId = x

【讨论】:

    【解决方案2】:

    嗯,看来你可以做如下查询(虽然我不太明白其中的逻辑):

    SELECT A.*, U.*
    FROM (SELECT DISTINCT friendUserId FROM usersFriends) UF
    JOIN activities A ON A.userId = UF.friendUserId
    JOIN users U ON U.id = A.userId
    WHERE A.objectId = x
    

    或者

    SELECT DISTINCT A.*, U.*
    FROM usersFriends UF
    JOIN activities A ON A.userId = UF.friendUserId
    JOIN users U ON U.id = A.userId
    WHERE A.objectId = x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2017-10-18
      • 1970-01-01
      • 2019-09-22
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多