2012-12-05 46 views
0

我有兩個mysql表用戶&消息。請你幫我創建一個sql查詢,它只返回登錄用戶Mike(user_id = 1)發送或接收到的最新消息,以及發送消息的人的message_id,message_text & first_name,或者從......收到。按降序排列的message_id排序。從MySQL查詢中刪除重複結果

到目前爲止,我有查詢: -

SELECT message_id, first_name, message_text FROM tbl_users, tbl_messages 
WHERE 
(tbl_users.user_id = tbl_messages.sender_id AND tbl_messages.receiver_id = 1 
OR tbl_users.user_id = tbl_messages.receiver_id AND tbl_messages.sender_id = 1) 
GROUP BY tbl_users.first_name 
ORDER BY message_id DESC 

其中給出的結果如下圖所示。看來ORDER BY被忽略

Group by result

預先感謝您

tbl_users

--------------------------- 
| user_id | first_name | 
--------------------------- 
| 1  | Mike   | 
| 2  | John   | 
| 3  | George  | 
| 4  | Peter  | 
| 5  | Sarah  | 
--------------------------- 

tbl_messages

---------------------------------------------------------------- 
| message_id | sender_id | receiver_id | message_text | 
---------------------------------------------------------------- 
| 1   | 2   | 1    | Hello   | 
| 2   | 3   | 1    | How are you | 
| 3   | 1   | 5    | Hi there  | 
| 4   | 2   | 1    | Greetings  | 
| 5   | 1   | 4    | Good day  | 
| 6   | 3   | 1    | Hi    | 
| 7   | 5   | 1    | A message  | 
| 8   | 5   | 4    | Good morning | 
| 9   | 1   | 5    | Hello dear  | 
| 10   | 1   | 3    | Howdy   | 
---------------------------------------------------------------- 

期望的結果

---------------------------------------------- 
| message_id | first_name | message_text | 
---------------------------------------------- 
| 10   | George  | Howdy   | 
| 9   | Sarah  | Hello dear  | 
| 5   | Peter  | Good day  | 
| 4   | John  | Greetings  | 
---------------------------------------------- 

數據庫可用here

+0

你是指最近的信息來自或來自人X?結果表格沒有告訴Mike有沒有發送或收到消息? –

+0

可能的重複:http://stackoverflow.com/questions/5510034/mysql-exclude-duplicate-data – Thilo

+0

邁克給喬治,莎拉和彼得發送的ID爲10,95和3的郵件。 Mike的名字不應該在結果中,因爲他是登錄用戶。就像WhatsApp上顯示聊天列表的方式 – shingionline

回答

3

只要添加一個 GROUP BY條款可以解決您的問題,試試這個...

SELECT message_id, first_name, message_text FROM tbl_users, tbl_messages 
WHERE 
(tbl_users.user_id = tbl_messages.sender_id AND tbl_messages.receiver_id = 1 
OR tbl_users.user_id = tbl_messages.receiver_id AND tbl_messages.sender_id = 1) 
GROUP BY tbl_users.user_id 
ORDER BY message_id DESC 

UPDATE:更改整個查詢

SELECT t2.message_id, t2.first_name, t2.message_text FROM 
(SELECT u.user_id, m.message_id, u.first_name, m.message_text FROM `tbl_users` u 
    JOIN `tbl_messages` m ON (u.user_id = m.sender_id AND m.receiver_id = 1) 
    OR (u.user_id = m.receiver_id AND m.sender_id = 1) 
    ORDER BY m.message_id DESC 
) t2 
GROUP BY t2.user_id 
ORDER BY t2.message_id DESC 

結果:

+------------+------------+--------------+ 
| message_id | first_name | message_text | 
+------------+------------+--------------+ 
| 10   | George  | Howdy  | 
| 9   | Sarah  | Hello dear | 
| 5   | Peter  | Good Day  | 
| 4   | John  | Greetings | 
+0

我將修改問題以顯示添加GROUP BY時的結果 – shingionline

+0

通過'tbl_users進行分組。first_name'給出最接近的結果只是返回前4條消息而不是最後(最近)4.按多列分組不起作用 – shingionline

+0

@ user1715545 - 我更新了我的整個查詢,似乎工作正常.. 。對不起,回覆晚了... – rajukoyilandy

2

如果GROUP BY要刪除重複的領域。在這種情況下,GROUP BY tbl_users.first_name應該做到這一點。

+0

你是什麼意思?如果你有'GROUP BY tbl_users.first_name',它會顯示唯一的名字。如果你想顯示所有字段的唯一值,你可以通過GROUP BY多個字段。如'GROUP BY tbl_users.first_name,tbl_message.message_text'。這將顯示唯一的消息/用戶條目。 – cjsissingh

+0

你想成爲唯一的每個領域都需要在「GROUP BY」中。 – cjsissingh

+0

通過'tbl_users.first_name'進行分組可以得到最接近的結果,即返回前4個郵件而不是最後(最近)4.按多列分組不會工作 – shingionline

0

我不確定你可以通過連接實現這一點。子選擇查詢可能會對您有所幫助。

select a.first_name, 
     (select message_text from tbl_messages b 
      where (a.user_id = b.sender_id and b.sender_id = 1) 
       or (a.user_id = b.receiver_id and b.receiver_id = 1) 
      order by message_id DESC 
      LIMIT 1) 
    from tbl_users a; 
+0

我會嘗試此操作並讓您知道 – shingionline

+0

I已經嘗試完全按照您鍵入的方式運行代碼,但我沒有收到任何結果 – shingionline

+0

@ user1715545我犯了一個錯誤,並將過濾器放在'user_id'上。更新了查詢。請嘗試讓我知道。 –

0

您在ORDER BY子句中缺少表名。另外我建議在表格上使用別名。因此,您的查詢可能看起來像這樣:

/* All Mike's messages */ 
SELECT 
    m.message_id, 
    u.first_name, 
    m.message_text 
FROM 
    tbl_users AS u, 
    tbl_messages AS m 
WHERE 
(
    u.user_id = m.sender_id AND 
    m.receiver_id = 1 
) OR (
    u.user_id = m.receiver_id AND 
    m.sender_id = 1 
) 
ORDER BY 
    m.message_id DESC; 

但是,我認爲最好單獨獲取發送和接收的消息結果。所以:

/* Messages sent my Mike */ 
SELECT 
    m.message_id, 
    u.first_name, 
    m.message_text 
FROM 
    tbl_users AS u 
    INNER JOIN tbl_messages AS m ON m.receiver_id = u.user_id 
WHERE 
    m.sender_id = 1 
ORDER BY 
    m.message_id DESC; 

/* Messages received my Mike */ 
SELECT 
    m.message_id, 
    u.first_name, 
    m.message_text 
FROM 
    tbl_users AS u 
    INNER JOIN tbl_messages AS m ON u.user_id = m.sender_id 
WHERE 
    m.receiver_id = 1 
ORDER BY 
    m.message_id DESC; 
+0

我需要同時檢索發送和接收的消息,以便我可以列出Mike參與的對話。類似於WhatsApp上列出的聊天方式。表名上的別名很好,我在運行第一個查詢時得到的結果與問題中的圖像完全相同,即使我添加了「GROUP BY u.first_name」,第一個結果應該是message_id = 10 – shingionline

+0

我得到我的第一個結果是「喬治霍迪10」 – Geo