簡體   English   中英

查詢返回其他行

[英]Query returns additional rows

我有這種用於簡單聊天的表格:

messages table structure
+----+---------+-----------+---------+------+------+
| id | to_user | from_user | message | read | sent |
+----+---------+-----------+---------+------+------+

我需要獲取每個看起來像這樣的對話的列表

Username ----  Message ---- Date

我正在使用此查詢來做到這一點:

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE `from_user` = '1' --id of user who is requesting the list
   OR `to_user` = '1'  --id of user who is requesting the list
   GROUP BY `to_user` , `from_user`
   )
LIMIT 0 , 30

這幾乎可以正常工作,我的問題是它返回的不是我的對話的最后一條消息,而是每個用戶的最后一條消息,因此,假設用戶12正在交談,並且我正在獲取此列表,這就是我得到的:

+----+---------+-----------+-----------------------+------+---------------------+
| id | to_user | from_user | message               | read | sent                |
+----+---------+-----------+-----------------------+------+---------------------+
|  3 |       2 |         1 | Message 1 from user 1 |    0 | 2012-01-11 13:20:54 |
|  4 |       1 |         2 | Message 1 from user 2 |    0 | 2012-01-11 13:24:59 |
+----+---------+-----------+-----------------------+------+---------------------+

而且我只想獲取最后一條消息,即4 ,因為sent字段是第4條記錄中最高的字段,所以我該如何解決呢?

編輯刪除group by即使用戶與多個用戶交談,我也只收到一條消息

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE (`from_user` = '1' OR `to_user` = '1')
   )
LIMIT 0 , 30

我相信,groupby將束縛他們。

您正在從每個用戶那里獲得最后一條消息,因為您已經為to_user和from_user都完成了GROUP BY。

您的查詢中無需使用GROUP BY子句。

這是您的操作方式:

SELECT *
FROM (SELECT * 
  FROM messages
  WHERE from_user = ?
  OR to_user = ?
  ORDER by from_user, to_user, sent DESC
) x
GROUP BY from_user, to_user
ORDER BY sent DESC
LIMIT 1;

在mysql中,通過聚合其他列的組返回每個組的第一行。 通過選擇有序行集(內部查詢)的形式,我們可以獲取每次會話的最新行。

刪除in語句中的group by子句-在這種情況下,它是無用的。 它為to_userfrom_user每個不同配對返回sent時間戳。 您實際上只希望在to_userfrom_user等於某個值的情況下sent的最大值。 通過丟失group by ,您將只返回一條記錄,該記錄顯示了發給用戶或來自用戶的最新消息。

看起來像這樣:

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE `from_user` = '1' --id of user who is requesting the list
   OR `to_user` = '1'  --id of user who is requesting the list
   )
LIMIT 0 , 30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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