[英]MySQL Data from 3 tables
我有三個與消息傳遞系統相關的MySQL表。 下面顯示了與我的問題有關的每個表的模式和樣本數據:
`messages`:
+----+---------+----------+
| id | subject | senddate |
+----+---------+----------+
| 1 | Testing | 12344555 |
+----+---------+----------+
`message_senders`:
+------------+---------+---------+
| message_id | user_id | trashed |
+------------+---------+---------+
| 1 | 1 | 1 |
+------------+---------+---------+
`message_recipients`:
+------------+---------+------+----------+---------+
| message_id | user_id | type | readdate | trashed |
+------------+---------+------+----------+---------+
| 1 | 1 | to | 12344555 | 1 |
+------------+---------+------+----------+---------+
| 2 | 1 | cc | 12344555 | 1 |
我的問題是,我如何選擇由用戶發送或接收的所有郵件,將垃圾郵件參數設置為1,而不選擇重復的郵件。 例如,請考慮以下情形:
我想獲取被user_id
1刪除的所有郵件的郵件ID,但是我不想檢索重復的ID(例如,在上面的數據中, user_id
1是message_id
1的發送方和接收方。我不想返回兩次message_id
1,但是要獲取該用戶的所有消息。
我想我需要結合使用JOIN
和UNION
,但是經過一整天的PHP,我的大腦無法正常工作!
嘗試此操作,看看它是否僅對message表中的每條消息返回一行。
select * from messages
left join message_senders on messages.id = message_senders.message_id
left join message_recipients on messages.id = message_recipients.message_id
where message_senders.trashed = 1 or message_recipients.trashed = 1 and messages.user_id = <value>
我想到的解決方案是使用UNION
d子查詢:
SELECT DISTINCT * FROM messages WHERE id IN (
(SELECT message_id FROM message_recipients WHERE user_id=1 AND trashed=1)
UNION
(SELECT message_id FROM message_senders WHERE user_id=1 AND trashed=1)
)
假設您已經想到了查詢-我只是暗示您可以使用DISTINCT關鍵字來強制數據庫不返回重復項。 我相信您可以自己解決,因為自我結論最有效。
另外,一條建議-始終將日期存儲為datetime
或date
而不是int
。 您可以避免夏令時問題,並且可以使用MySQL提供的各種日期函數。 日期在內部保存為4個字節的整數,與int
字段相同。
在這里,試一試:
select distinct m.id
from messages m
left join message_senders s on m.id = s.message_id
left join message_recipients r on m.id = r.message_id
where ((s.user_id = 1 and s.trashed = 1) or (r.user_id = 1 and r.trashed = 1))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.