php - MySQL 获取最后一条消息 (VarChar)

标签 php mysql subquery messaging forum

我正在尝试从某个线程获取最后一条消息,但似乎无法正确获取我的查询。 我似乎没有收到某个线程的最后一条消息。

简介

我使用 3 个表——message、message_users、message_threads

所有消息都属于某个线程(有点像论坛和帖子的工作原理?) 用户可以将多个用户添加到某个线程,以便多个用户可以在同一个线程中互相发送消息。

数据库结构

messages table
    id  |   t_id  |  u_id  |  message  |  time
--------+---------+--------+-----------+--------
      1 |    1    |   1    |  hello!   | timestamp
      2 |    1    |   2    |  hi!      | timestamp
      3 |    2    |   1    |  testing  | timestamp


message_threads
   id |  author |  subject  
------+---------+-----------
    1 |    1    | Subject 1  
    2 |    3    | Subject 2 
    3 |    2    | Subject 3


message_users
   id |   t_id  |  u_id  |  read  | nonotice
------+---------+--------+--------+----------
    1 |    1    |   1    |   0    |   0
    2 |    1    |   2    |   0    |   0
    3 |    2    |   1    |   1    |   0

查询

这是我正在使用的查询,它几乎可以工作,只是它没有得到最后一个 ID,也没有得到最后一条消息,有什么想法吗? (是的,我已经查看并搜索了之前提出的有关该主题的问题,但无法根据答案以某种方式修复查询)

SELECT
  m2.message,
  mt.id AS thread_id,
  max(m.id) AS message_id, 
  max(m.time) AS time, 
  mt.subject
FROM message_users AS mu
LEFT JOIN message_threads AS mt ON mt.id = mu.t_id
LEFT JOIN message AS m  ON m.t_id = mt.id
INNER JOIN (
  select message as messages_text 
  from message group by t_id
) AS m2 ON m2.id = m.id
WHERE mu.u_id = 1 AND mu.read = 0 AND mu.nonotice = 0
GROUP BY mt.id
ORDER BY m.id DESC

最佳答案

SELECT
  m.t_id,
  m.message,
  m.id AS max_message_id,
  m.ts AS max_message_ts,
  t.subject
FROM messages AS m
JOIN message_threads AS t ON m.t_id = t.id
JOIN (
  SELECT t_id, max(id) max_id FROM messages GROUP BY 1
) AS m2 ON m.id = m2.max_id
JOIN message_users AS u ON u.t_id = t.id AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0

如果上述 SQL 变得缓慢,您可以执行以下任一操作:

1 - 将where添加到内连接SQL中以使结果更小,即:

SELECT
  m.t_id,
  m.message,
  m.id AS max_message_id,
  m.ts AS max_message_ts,
  m2.subject
FROM messages AS m
JOIN (
  SELECT t.id, max(m.id) AS max_id, t.subject
  FROM messages AS m
  JOIN message_threads AS t ON m.t_id = t.id
  JOIN message_users AS u ON u.t_id = t.id 
     AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0
  GROUP BY 1
) AS m2 ON m.id = m2.max_id

2 - 重新设计message_thread添加计算列:(last_message_id,last_updated)等

PS - 尽量避免使用 MySQL 关键字作为列名称

enter image description here

关于php - MySQL 获取最后一条消息 (VarChar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41560626/

相关文章:

php - <input type=submit/> 是否在幕后使用了 javascript

PHPExcel xlsx 文件阅读器

sql-server - 我如何在 Sql 2008 中执行此空间查询?

mysql - 使用子查询上的左连接和最大值来加速 mysql 查询

c# - HQL 子查询的意外 NULL 返回

php - 无法让我的 mysql_query() 在我的 php 脚本中工作

php - 用php写sql

php - MySQL 插入双引号 PHP

MySQL 添加连接会减慢整个查询

mysql - 在nodejs查询之外显示mysql结果以供稍后使用