簡體   English   中英

通過左聯接選擇多個

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

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