【问题标题】:SQL: Joining Same Column Twice For CriteriaSQL:为条件连接同一列两次
【发布时间】:2018-10-05 00:19:27
【问题描述】:

我有一个名为 member.id 的列,它存在于一个名为 poster 的表中,同时作为 poster.sender 和 poster.reciever。

我需要一个选择 member.value 的查询,其中 member.id 是 poster.sender 或 poster.reciever。

[我知道这些名字没有多大意义——我没有想出它们]

到目前为止,我有这个,但它不起作用:

SELECT member.value
FROM ((poster INNER JOIN member ON poster.sender = member.ID) 
INNER JOIN poster ON poster.sender= member.id

WHERE (member.id <> ?
AND (((poster.Sender = ?) OR (poster.reciever = ?))AND (poster.Status = 'Accepted'))

任何想法都会非常有帮助!

【问题讨论】:

  • 你使用的是哪个数据库?
  • 用您正在使用的数据库标记您的问题。 “已接受”与您的问题有什么关系?

标签: mysql sql ms-access


【解决方案1】:

试试这个:

SELECT 
    member.value
FROM 
    poster s INNER JOIN member ON s.sender = member.ID
INNER JOIN poster r ON r.receiver = member.id
WHERE 
    member.id <> ?
AND 
    (
        s.sender = ? 
    OR r.reciever = ?
    ) 
AND 
    s.status = 'Accepted'

您不能在没有别名的查询中使用两次表,因此别名为 sr

还可以根据您的要求更改 where 条件 -> status = 'Accepted' 来自发送方或接收方表或两者。

【讨论】:

    【解决方案2】:

    你会想要这样的东西......

    select distinct(value)
    from
    (
    (select member.value from member inner join poster on member.id = poster.sender) 
    union 
    (select member.value from member inner join poster on member.id = poster.receiver) 
    ) 
    

    【讨论】:

      【解决方案3】:
      SELECT value
             FROM member
             WHERE EXISTS (SELECT *
                                  FROM poster
                                  WHERE member.id IN (poster.sender,
                                                      poster.receiver));
      

      应该相当于 N Mason 的,但可能更快。至少它不需要消除UNION 的重复项(希望优化器忽略外部DISTINCT,因为UNION 的结果已经不同,不会再无用地重复)。消除重复项可能会很昂贵。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多