2017-09-25 71 views
0

我做這個查詢Null值SQL連接mysql中

SELECT m.chat_id, m.msg_sender_id, m.message, m.id, 
     DATE_FORMAT(m.created_at, '%Y-%m-%d %H:%i:%s') as created_at, 
     g.id as group_id, g.name as group_name, g.image as group_image 
FROM message as m 
INNER JOIN chat as c ON c.id = m.chat_id 
LEFT OUTER JOIN group as g ON c.group_id = g.id 
WHERE c.id = 434 
ORDER BY m.id ASC 

我想實現的是擺脫聊天的所有消息,如果有參與聊天返回基團。組被附加到聊天對象(而不是消息對象)。出於某種原因,我在所有行上獲得group

你能建議我該如何做到這一點?

============= EDIT ==============

group表的結構是這樣的:

`id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime(6) NOT NULL, 
    `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `image` longtext COLLATE utf8_bin, 
    `status` int(11) DEFAULT NULL, 
    `creator_id` int(11) NOT NULL 

chat表結構看起來像這樣

`id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime(6) NOT NULL, 
    `group_id` int(11) DEFAULT NULL, 
    `person1_id` int(11) NOT NULL, 
    `invitation_id` int(11) NOT NULL, 

message表看起來像這樣

`id` int(11) NOT NULL AUTO_INCREMENT, 
    `message` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 
    `created_at` datetime(6) NOT NULL, 
    `chat_id` int(11) NOT NULL, 
    `msg_sender_id` int(11) NOT NULL, 

這是從查詢

434 14 Some text 900 2017-09-10 09:48:56 3 My group 1 image.jpg 
434 13 Some text 2 901 2017-09-10 09:48:59 3 My group 1 image.jpg 
434 14 Some text 3 935 2017-09-16 15:37:07 3 My group 1 image.jpg 
434 14 Some text 4 968 2017-09-21 06:52:56 3 My group 1 image.jpg 
+1

我不太瞭解這個問題。你的查詢看起來很好,但是你從'group_group'得到了比預期更多的結果?請添加一些示例數據。 – HoneyBadger

+0

這裏沒有'group'。 – Strawberry

+0

可能你在所有的三個表中都有id = 434,包括group,因此你得到的是所有行的groupName。 –

回答

1

這是太長了評論的結果。

您的查詢語句是正確的。對於chatmessages,您有inner join。您有left outer joingroup

我想你可能會誤解結果集。結果集是每行有全部列的表格。您不會獲得消息的某些列,然後獲得其他列的聊天。這就是SQL的工作原理。

或者,您的查詢由m.id訂購。也許這種排序恰好會將所有帶有組的消息帶到最前面。

+0

謝謝,這是我的結構錯誤。它顯示所有行中的組,因爲所有聊天都附加了組。 – bla0009