[英]Select multiple with Left join
我有一個聊天表,用戶可以在其中發布消息,該消息存儲在db中,並由預期的收件人讀取。
當我發送普通聊天時,沒問題,但是當我發送多個或廣播時,我會得到庫存。
table users
id | alias
-----------
1 | mark
2 | joe
表聊天
id | uid | msg | cmd
-----------------------
1 | 1 | hi | msg
2 | 2 | hello | msg
3 | 1,2 | msg | brc <- broadcast
用於閱讀正常的一對一消息
Select u.alias, c.id cid from chat c left join user u on u.id=c.uid
where c.uid= 1
現在是廣播,對於ID為1的用戶,我嘗試了
Select u.alias, c.id cid from chat c left join user u on u.id=c.uid
where id in IN (1,2)
對於另一個ID為2的用戶,
Select u.alias, c.id cid from chat c left join user u on u.id=c.uid
where id in IN (1,2)
我得到一個空結果
讓我們標准化表格:
表用戶
id | alias
-----------
1 | mark
2 | joe
表聊天
id | msg | cmd
-----------------------
1 | hi | msg
2 | hello | msg
3 | msg | brc <- broadcast
表聊天
id | userid| msgid
-----------------------
1 | 1 | 1
2 | 2 | 2
3 | 1 | 3
4 | 2 | 3
那么您可以通過以下方式獲取所有標記的消息:
SELECT c.msg
FROM chat c
LEFT JOIN chatrouting cr ON cr.msgid = c.id
LEFT JOIN user u ON u.id = cr.userid
WHERE u.alias = 'mark'
嘗試使用此:
Select u.alias, c.id cid from chat c
left join user u on FIND_IN_SET(u.id,'1,2')
where id in IN (1,2)
因為行看起來像3 | 1,2 | 味精| brc <-broadcast因此, chat
表中的uid不僅是int,它還可以具有2個或多個整數分開的逗號。 如果我正確理解。
該查詢失敗的原因是,您正在測試單個列以匹配您自己的列1,2
的串聯。 這通常是一個壞主意,因為它不符合規范化關系數據庫的范式。 列應具有奇異的原子值。 重新設計“廣播”非常容易,這樣就不會出現此問題。
我注意到另外兩個問題:
這些查詢中的每一個都應該給出一個錯誤,指出存在一個“歧義定義的列”,但是MySQL顯然接受了這一點。 無論如何,您都應該在id
添加表格別名,以指定您要表示的表格。
同樣,在這種情況下根本不需要使用左聯接。 只有在另一個表中可能不存在id的情況下,這才有意義,這應該是不可能的,因為應該由外鍵約束來保護它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.