这是我的mysql查询:
SELECT t.id,
t.user_id_1,
t.user_id_2,
m.id as message_id,
m.from_user_id,
m.text,
max(m.date_sent),
m.viewed
FROM thread t
JOIN message m
ON t.id = m.thread_id
WHERE t.user_id_1 = 1
OR t.user_id_2 = 1
GROUP BY t.id
有两个表,线程和消息。线程表存储记录(每个记录是一个对话),消息表有消息。它将具有线程表的外键,以指示消息所在的线程。
我试图获取一个线程列表,以及每个线程的最新消息。但上述情况无效。
我想要做的是,它获取所有线程,并将其与消息(在该线程中)连接。然后按线程ID对消息进行分组,并使用max函数给出的最近日期的记录。
但是它会给出一些带有最新日期的随机消息(消息来自不同的记录)。
有谁知道如何解决这个问题?
答案 0 :(得分:2)
您可以拥有一个单独的子查询,为表date_sent
上的每个thread_id
获取最新的message
。由于子查询只有两列,因此您需要将结果连接到表本身,以获得其他列匹配的结果:thread_id
和date_sent
。
SELECT t.id,
t.user_id_1,
t.user_id_2,
m.id as message_id,
m.from_user_id,
m.text,
m.date_sent,
m.viewed
FROM thread t
INNER JOIN message m
ON t.id = m.thread_id
INNER JOIN
(
SELECT thread_id, MAX(date_sent) date_sent
FROM message
GROUP BY thread_id
) s ON m.thread_id = s.thread_id
AND m.date_sent = s.date_sent
WHERE 1 IN (t.user_id_1, t.user_id_2)