簡體   English   中英

左/內連接,AND,WHERE和OR

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM