我有以下表格:
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'还没有消息,但它是一个已接受的聊天,因此它应该在结果中。
答案 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
我希望这个帮助