在我的mysql查询中,我尝试使用最近的行获取所有线程。
$query = "SELECT th.id, tm.message, tm.date_sent, tm.date_sent>tu.last_read_date AS new
FROM thread th
JOIN thread_user tu ON th.id=tu.thread_id AND tu.user_id={$user_id}
JOIN thread_message tm ON th.id=tm.thread_id
JOIN (
SELECT thread_id, MAX(date_sent) date_sent
FROM thread_message
GROUP BY thread_id
) q ON tm.thread_id = q.thread_id AND tm.date_sent = q.date_sent
ORDER BY tm.date_sent DESC";
这样可行,但问题是,如果有两行或更多行的日期是最新的并且它们是相同的日期,那么它将同时加入它们。我需要第三个连接语句加入最多1行。
我也不想假设最大的ID意味着它是最近的一行,因为我总是可以在以后手动更改日期。
有谁知道如何解决这个问题?
由于
答案 0 :(得分:1)
执行此操作的一种方法是为每个组建立一个行号,在这种情况下,您的论坛为thread_id
和date_sent
。使用MySql
,您需要使用user-defined variables
执行此操作:
SELECT th.id,
tm.message,
tm.date_sent,
tm.date_sent>tu.last_read_date AS new
FROM thread th
JOIN thread_user tu ON th.id=tu.thread_id AND tu.user_id={$user_id}
JOIN (
SELECT id,
thread_id,
message,
date_sent,
@rn:=IF(@prevthread_id=thread_id, @rn+1, 1) rn,
@prevthread_id:=thread_id
FROM thread_message, (SELECT @rn:=1, @prevthread_id:=0) t
ORDER BY thread_id, date_sent DESC, id
) tm ON th.id=tm.thread_id
AND tm.rn = 1
ORDER BY tm.date_sent DESC
也许这对您来说更容易(但只是因为您正在使用mysql
):
SELECT th.id,
tm.message,
tm.date_sent,
tm.date_sent>tu.last_read_date AS new
FROM thread th
JOIN thread_user tu ON th.id=tu.thread_id AND tu.user_id={$user_id}
JOIN thread_message tm ON th.id=tm.thread_id
JOIN (
SELECT thread_id,
id,
MAX(date_sent) date_sent
FROM thread_message
GROUP BY thread_id
) q ON tm.thread_id = q.thread_id
AND q.id = tm.id
AND tm.date_sent = q.date_sent
ORDER BY tm.date_sent DESC
这将返回任意id
加入。
答案 1 :(得分:0)
在我看来,如果查询产生了您所期望的内容,除了上一个JOIN
之外,您只需修改GROUP BY
即可返回一行。
JOIN (
SELECT thread_id, MAX(date_sent) date_sent
FROM thread_message
GROUP BY thread_id
) q ON tm.thread_id = q.thread_id AND tm.date_sent = q.date_sent
GROUP BY tm.date_sent
ORDER BY tm.date_sent DESC";