php - 在 MySQL 子查询和 ORDER BY 子查询日期时间中选择多列

标签 php mysql

有谁知道如何选择这个。 表消息如下所示:

+----+------------+----------+---------+--------+-------------------+
| 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/

相关文章:

php - 如何将生成的图像文件移动到 PHP 中的自定义目录?

php - 无法让 WordPress 显示多站点中的所有类别

mysql - MySQL 中奇怪的排序错误?

php - 接收订单详情和付款确认(电子商务网站)

jquery - SQL查询: similar text in Database

具有大量数据的 PHP DateTime 错误

php - API 客户端使用什么设计模式?

php - 页面加载对象两次

java - 在 php 中运行 jar

php - 选择本周 18 日起的值 :00