[英]Left/Inner join with AND,WHERE, and OR
我有2張桌子:
友人
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”字段。
因此,我將擁有ID = 1和Profile = 2的行。下一行將是ID = 3和Profile =1。現在,ID為2和3的兩個用戶都是我的朋友(ID 1),所以我需要顯示來自1、2和3(我和我的兩個朋友)的所有消息,其中check = 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
不能明智地做到這一點。
假設您使用的是MySQL,這不應返回重復的行,因為UNION
的默認修飾符是DISTINCT
。 其他RDBMS引擎可能會要求您明確聲明這一點或使用其他解決方法(例如,實際消息ID上的GROUP BY
)。
您可能還想在兩個查詢的WHERE
子句中添加一個m.Check = 1
條件,以確保僅在接受了好友請求的情況下獲得消息。
顯然,以上內容旨在用作准備好的語句,其中兩個占位符都將替換為相同的數據memberID
cookie。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.