MySQL SELECT * FROM ... WHERE ... ORDER BY'哪一个在其他表中有最新记录'

时间:2014-01-31 10:02:58

标签: html mysql sql web

我有以下表格:

chats:
+--------+-------------+--------------+--------------+---------------------+
| chatID | firstPerson | secondPerson | chatAccepted | creationDate        |
+--------+-------------+--------------+--------------+---------------------+
| 1      | 59          | 52           | 1            | 31-01-2014 09:32:37 |
| 2      | 59          | 12           | 0            | 28-01-2014 11:07:25 |
| 3      | 34          | 59           | 1            | 28-01-2014 08:50:48 |
| 4      | 78          | 59           | 1            | 26-01-2014 03:58:12 |
+--------+-------------+--------------+--------------+---------------------+

messages:
+-----------+-------------+--------+----------+------------+---------------------+
| messageID | messageText | chatID | senderID | receiverID | creationDate        |
+-----------+-------------+--------+----------+------------+---------------------+
| 1         | Lorum...    | 1      | 59       | 52         | 31-01-2014 09:32:37 |
| 2         | Ipsum...    | 1      | 52       | 59         | 28-01-2014 11:07:25 |
| 3         | Dollar...   | 3      | 34       | 59         | 28-01-2014 08:50:48 |
| 4         | Sit...      | 3      | 59       | 34         | 31-01-2014 11:09:48 |
+-----------+-------------+--------+----------+------------+---------------------+

我想要得到的结果是chatID where(firstPerson = 59或secondPerson = 59)和chatAccepted = 1.现在我无法弄清楚:我希望结果排序'一个人有最新消息'。

我尝试了很多不同的东西,一个是:

"SELECT chats.chatID, chats.firstPerson, chats.secondPerson, str_to_date(messages.creationDate,'%d-%m-%Y %H:%i:%s') AS cdate
    FROM chats
    INNER JOIN messages
    ON chats.chatID=messages.chatID 
    WHERE chats.chatAccepted = 1 AND messages.receiverID = 59
    UNION SELECT chats.chatID, chats.firstPerson, chats.secondPerson, str_to_date(messages.creationDate,'%d-%m-%Y %H:%i:%s') AS cdate
    FROM chats
    INNER JOIN messages
    ON chats.chatID=messages.chatsID 
    WHERE chats.chatAccepted = 1 AND messages.senderID = 59
    ORDER BY cdate desc"

这就像魅力一样,除了还没有消息的时候。比它只是结果没有记录。但我需要知道是否接受了聊天,否则他们甚至无法开始聊天。

非常欢迎任何帮助。 如果您需要更多信息,请告诉我!

更新:所以我在这种情况下至少想要的结果是:

+--------+
| chatID |
+--------+
| 3      |
| 1      |
| 4      |
+--------+

这是因为chatID'3'有最新消息链接到它。 chatID'4'还没有消息,但它是一个已接受的聊天,因此它应该在结果中。

2 个答案:

答案 0 :(得分:1)

SELECT  c.chatID, c.firstPerson, c.secondPerson, str_to_date(m.creationDate,'%d-%m-%Y %H:%i:%s') AS cdate
FROM    chats c left join messages m on c.chatID=m.chatID 
WHERE   c.chatAccepted = 1 AND 
        59 in (m.senderID, m.receiverID)
ORDER BY m.creationDate desc

答案 1 :(得分:0)

为了保持聊天功能,你需要一个LEFT JOIN的消息,那么你应该决定女性订单是否有没有消息的聊天,假设您想使用聊天创建日期,然后使用COALESCE功能选择聊天创建日期,没有消息(消息创建日期为NULL)。

通过这种方式,您可以使用多个条目来进行包含更多消息的聊天,而不必使用cDate上的聚合函数MAX来仅包含最后的消息条目:

SELECT c.chatID,
       c.firstPerson,
       c.secondPerson,
       str_to_date(MAX(COALESCE(m.creationDate, c.creationDate)),'%d-%m-%Y %H:%i:%s') AS cdate
  FROM chats AS c LEFT OUTER JOIN 
       messages AS m ON c.ChatID = m.ChatID
 WHERE c.Accepted = 1 AND (c.firstPerson=59 OR c.SecondPerson=59)
 GROUP BY c.chatID, c.firstPerson, c.secondPerson
 ORDER BY cdate DESC

我不确定在MySql中将str_to_date函数应用于聚合字段是否有效,在否定的情况下,查询应该重写为:

SELECT chatID,
       firstPerson,
       secondPerson,
       str_to_date(cdate,'%d-%m-%Y %H:%i:%s') AS cdate
  FROM (SELECT c.chatID,
               c.firstPerson,
               c.secondPerson,
               MAX(COALESCE(m.creationDate, c.creationDate)) AS cdate
          FROM chats AS c LEFT OUTER JOIN 
               messages AS m ON c.ChatID = m.ChatID
         WHERE c.Accepted = 1 AND (c.firstPerson=59 OR c.SecondPerson=59)
         GROUP BY c.chatID, c.firstPerson, c.secondPerson
         ORDER BY cdate DESC) AS devTbl

我希望这个帮助