多表JOINS和条件

时间:2014-07-10 11:46:38

标签: mysql join

从下表中我需要检索特定recipientID的消息,前提是在senderID表中找到userspostIDmessages中为20或NULL {1}}表。

我无法使用两个或更多单独的查询,因为我需要LIMITOFFSET申请分页。

messages表:

--------------
ID | messageType | recipientID | senderID | postID (optional)
-------------------------------------------------------------
1  | 1           | 100         | 1        | 20
2  | 2           | 100         | 2        | NULL
3  | 3           | 100         | 2        | 40
4  | 3           | 100         | 5        | 75
5  | 2           | 100         | 7        | 20

users表:

---
ID
---
1
2

posts表:

---------------
ID | postStatus
---------------
20  | published
40  | draft

所需结果:

messages.ID | messages.messageType
----------------------------------
1           | 1
2           | 2

从某个地方开始,我从下面的查询开始。但我一直坚持如何修改它以给我想要的结果。

    SELECT messages.ID, 
           messages.messageType 
      FROM messages
RIGHT JOIN users 
        ON messages.senderID = users.ID
RIGHT JOIN posts 
        ON messages.postID = posts.ID
     WHERE messages.recipientID = 100
      DESC LIMIT 100 OFFSET 1

如果可能的话,我想避免使用子查询。

我也愿意对当前桌面设计的结构进行更改。

1 个答案:

答案 0 :(得分:1)

给出结果集必须包含NULL行,您可以尝试:

   SELECT m.ID, 
          m.messageType
     FROM messages m
     JOIN users u
       ON m.senderID = u.ID
LEFT JOIN posts p
       ON m.postID = p.ID
    WHERE m.recipientID = 100 AND (m.postID = 20 OR m.postID IS NULL)

Live DEMO

   SELECT m.ID, 
          m.messageType
     FROM messages m
     JOIN users u
       ON m.senderID = u.ID
LEFT JOIN posts p
       ON m.postID = p.ID
    WHERE m.recipientID = 100 AND (m.postID IS NULL OR p.postStatus = 'published')

Live DEMO

我认为有一种方法可以动态地包含postStatus,而无需直接指出您想要的那些,因为您有多个状态并且您想要2个特定的状态。

postStatus的主要问题在于,除了publishedNULL之外,您可以拥有多个有效并且具有多种状态的条目。