我正在开发一个自定义论坛系统,我试图弄清楚如果用户在其中发帖,如何将一个帖子放在列表的顶部。
我的查询已经得到了这个
SELECT
user_threads.threadID,
user_threads.title,
user_threads.uid,
user_threads.postDate,
thread_messages.posted
FROM
user_threads,
thread_messages
WHERE
parent = :parent
GROUP BY
user_threads.title
ORDER BY
thread_messages.posted
DESC
哪个似乎不起作用。如果我在新帖子中发帖,它仍然在列表中的位置。
答案 0 :(得分:1)
您需要通过threadID
加入表格。此外,如果您只想在每个帖子中使用一行,则需要使用上一篇文章的日期。
SELECT
user_threads.threadID,
user_threads.title,
user_threads.uid,
user_threads.postDate,
MAX(thread_messages.posted) AS last_post
FROM
user_threads
LEFT JOIN
thread_messages ON thread_messages.threadID = user_threads.threadID
WHERE
parent = :parent
GROUP BY
user_threads.threadID
ORDER BY
last_post DESC
我使用了LEFT JOIN
,因此即使他们在thread_messages
中没有任何内容,也会显示主题。如果不需要,您可以使用常规JOIN
(又名INNER JOIN
)。
答案 1 :(得分:0)
您缺少JOIN条件。目前,您正在获得user_threads
和thread_messages
的叉积。这意味着你为每个线程获得了行并在结果中发布。
尝试添加一些链接
FROM
user_threads
JOIN
thread_messages USING(threadID)
在结果集中只获取一次每个线程。
答案 2 :(得分:0)
您需要将表格绑在一起。您可以通过向user_threads.threadID = thread_messages.threadID
添加类似WHERE
(猜测并需要检查第二列名称)的内容或通过重写查询来执行此操作:
SELECT
user_threads.threadID,
user_threads.title,
user_threads.uid,
user_threads.postDate,
thread_messages.posted
FROM
user_threads
JOIN
thread_messages ON thread_messages.threadID = user_threads.threadID
WHERE
parent = :parent
GROUP BY
user_threads.title
ORDER BY
thread_messages.posted
DESC
也不是,你可能应该替换
GROUP BY
user_threads.title
类似
GROUP BY
user_threads.threadID
或
GROUP BY
user_threads.threadID, user_threads.title
你的线程标题迟早可以重复使用,而ID应该是“永远”唯一的。 threadID最有可能导致更快的查询,因为数据库只需要比较数字与不同长度的文本。
答案 3 :(得分:0)
对表'user_threads'和'thread_messages'使用别名,即。
SELECT
A.threadID,
A.title,
A.uid,
A.postDate,
B.posted
FROM
user_threads A,
thread_messages B
WHERE
parent = :parent
//also do it with 'parent' field if parent is a field of user_threads
//A.parent else thread_messages B.parent
GROUP BY
A.title
ORDER BY
B.posted
DESC