我有两张桌子:
友
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
答案 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。