从下表中我需要检索特定recipientID
的消息,前提是在senderID
表中找到users
且postID
在messages
中为20或NULL {1}}表。
我无法使用两个或更多单独的查询,因为我需要LIMIT
和OFFSET
申请分页。
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
如果可能的话,我想避免使用子查询。
我也愿意对当前桌面设计的结构进行更改。
答案 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)
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')
我认为有一种方法可以动态地包含postStatus
,而无需直接指出您想要的那些,因为您有多个状态并且您想要2个特定的状态。
postStatus
的主要问题在于,除了published
和NULL
之外,您可以拥有多个有效并且具有多种状态的条目。