左/内连接与AND,WHERE和OR

时间:2013-04-23 09:36:36

标签: php sql join

我有两张桌子:

  ID  |  Profile  |  Check
------+-----------+---------
  int |    int    |   bool

ID是发送原始朋友请求的人,Profile是发送人请求的ID,Check是0 =请求待处理; 1 =请求已被接受。

消息

  OwnerID  |  ...
-----------+-------
    int    |  ...

其中OwnerID是编写邮件的成员的ID。

所以基本上,我首先要看的是:

从friends_list表中选择所有行,其中ID或Profile等于memberID cookie。但是我的困境是:如果我向其他用户发送朋友请求,那么我的ID将被放置在ID字段中,并且他们的ID将被放置在friend_list表的Profile字段中。但是,如果另一个用户请求我的朋友请求,那么我的ID将进入“配置文件”字段,他们将进入ID字段。

所以,我会有一行ID = 1,而Profile = 2.下一行是ID = 3,Profile = 1.现在,ID为2和3的用户都是我的朋友(ID 1) ),所以我需要显示来自1,2和3(我的和我的两个朋友)的所有消息,其中check = 1

1 个答案:

答案 0 :(得分:1)

你想要的是这个:

(
    SELECT m.*
    FROM Messages m
    INNER JOIN Friends f ON m.OwnerID = f.ID
    WHERE f.Profile = ?
) UNION (
    SELECT m.*
    FROM Messages m
    INNER JOIN Friends f ON m.OwnerID = f.Profile
    WHERE f.ID = ?
)

您需要查看两个单独的查询,我认为您不能通过 JOIN s的组合明智地做到这一点。

假设您使用的是MySQL,则不应返回重复的行,因为UNION的默认修饰符为DISTINCT。其他RDBMS引擎可能要求您明确说明或使用其他一些解决方法(例如实际消息ID上的GROUP BY)。

您可能还希望在两个查询的m.Check = 1子句中添加WHERE条件,以确保您只接收已接受好友请求的消息。

显然,上述内容旨在用作预备声明,其中两个占位符都将替换为相同的数据 - memberID cookie。