[英]How to sort data with a parent / child relationship
我为具有父/子关系的论坛存储线程,如下所示:
CREATE TABLE forum_threads (
thread_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INTEGER UNSIGNED NOT NULL DEFAULT 0,
topic_id INTEGER UNSIGNED NOT NULL,
user_id INTEGER UNSIGNED NOT NULL,
title VARCHAR(100) NOT NULL,
body TEXT NOT NULL,
create_date DATETIME NOT NULL,
PRIMARY KEY (thread_id),
FOREIGN KEY (parent_id)
REFERENCES forum_threads(thread_id),
FOREIGN KEY (topic_id)
REFERENCES forum_topics(topic_id),
FOREIGN KEY (user_id)
REFERENCES users(user_id)
);
新线程的parent_id = 0
,而回复parent_id = the thread being replied to
。 现在让我感到困惑的是,我想显示按最新答复排序的线程列表:
SELECT * FROM forum_threads
WHERE topic_id = :topic_id AND parent_id = 0
ORDER BY ??? DESC LIMIT :start, :display
不确定如何做到这一点?
如果父母不能有父母,则可以使用如下查询:
SELECT *
FROM forum_threads
ORDER BY
CASE WHEN parent_id=0 THEN thread_id ELSE parent_id END DESC,
Parent_id!=0,
thread_id DESC
这将按降序列出所有线程,并按最新线程的排序。
如果我正确理解该结构,则答复为带有parent_id
行,这些行指向“父”线程的thread_id
。
在这种情况下,这样的自连接将起作用-请注意SELECT *
必须执行,因为(a)您要从两个表中进行选择,因此*
表示“两个表中的所有行”,而(b)您需要到GROUP BY
特定列:
SELECT
parent.thread_id,
parent.parent_id,
parent.topic_id,
parent.user_id,
parent.title,
parent.body,
parent.create_date,
MAX(reply.create_date) AS reply_date
FROM forum_threads parent
INNER JOIN forum_threads reply ON parent.thread_id = reply.parent_id
WHERE topic_id = whatever AND parent_id = 0
GROUP BY
parent.thread_id,
parent.parent_id,
parent.topic_id,
parent.user_id,
parent.title,
parent.body,
parent.create_date
ORDER BY reply_date DESC
这样的事情也会起作用:
SELECT * FROM forum_threads `t1`
WHERE topic_id = :topic_id AND parent_id = 0
ORDER BY (SELECT `create_date` FROM `forum_threads` WHERE `parent_id`=`t1`.`thread_id` ORDER BY `create_date` DESC LIMIT 1) DESC LIMIT :start, :display
Ed Gibbs的解决方案如果您需要访问最新的答复(我的需要另外的子查询)会更好,但是如果您不需要它,这是一个更简单的解决方案(IMHO)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.