有谁知道如何选择这个。 表消息如下所示:
+----+------------+----------+---------+--------+-------------------+
| id | fromUserID | toUserID | message | status | dt |
+----+------------+----------+---------+--------+-------------------+
| 1 | 1 | 2 |Hey,wh...| seen |2018-08-15 17:43:51|
| 2 | 2 | 1 | Hey | send |2018-08-15 17:45:51|
+----+------------+----------+---------+--------+-------------------+
MySql查询,我想使用:
SELECT m.id,
(SELECT m.message, IF(m.fromUserID='1',1,0), m.status, m.dt
FROM messages m
WHERE (m.fromUserID='1' OR m.toUserID='1') AND (m.fromUserID=u.id OR m.toUserID=u.id)
ORDER BY m.dt DESC
LIMIT 1) AS m,
u.username,
u.id AS usID
FROM messages m
JOIN users u
ON u.id=IF(m.fromUserID='1',m.toUserID,m.fromUserID)
WHERE (m.fromUserID='1' OR m.toUserID='1') AND
m.dt>IFNULL((SELECT d.dt FROM deletechat d WHERE d.userID='1' AND d.withUserID=IF(m.fromUserID='1',m.toUserID,m.fromUserID)),'0000-00-00 00:00:00')
GROUP BY u.id
ORDER BY m.dt
我用过这个,但无法按日期排序。而且如果你在 JSON 字符串中发现一些 ',',\',\",我无法在 PHP 中读取它
SELECT m.id,
(SELECT CONCAT('{"message":"', m.message, '","myLast":"', IF(m.fromUserID='1',1,0), '", "status":"',m.status,'"}')
FROM messages m
WHERE (m.fromUserID='1' OR m.toUserID='1') AND
(m.fromUserID=u.id OR m.toUserID=u.id)
ORDER BY m.dt DESC
LIMIT 1) AS m,
u.username,
u.id AS usID
FROM messages m
JOIN users u
ON u.id=IF(m.fromUserID='1',m.toUserID,m.fromUserID)
WHERE (m.fromUserID='1' OR m.toUserID='1') AND
m.dt>IFNULL((SELECT d.dt FROM deletechat d WHERE d.userID='1' AND d.withUserID=IF(m.fromUserID='1',m.toUserID,m.fromUserID)),'0000-00-00 00:00:00')
GROUP BY u.id
最佳答案
Question: I cannot sort by date
您可以使用另一个 SELECT 从当前查询中进行选择,而不是使用 GROUP BY:
SELECT * FROM
(SELECT m.id ... /* <-- Your whole query */
...
ORDER BY m.dt DESC /* <-- At the end instead of GROUP BY user ORDER BY */
) as r LIMIT 1 /* <-- Select only the first result, which is the youngest */
<小时/>
Question: if you find some ',', \', \" in the JSON string, I can't read it in PHP
在较新的 MYSQL 版本中,有用于该目的的 JSON 函数,例如JSON_OBJECT() or JSON_QUOTE() 。像这样使用:
SELECT JSON_OBJECT('message', m.message, 'myLast', IF(m.fromUserID='1',1,0) FROM messages m
对于较旧的 MySQL 版本,您可以使用 REPLACE()转义所有特殊字符,例如引号。
关于php - 在 MySQL 子查询和 ORDER BY 子查询日期时间中选择多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52420491/