【发布时间】:2017-11-20 06:11:50
【问题描述】:
我正在使用 MySQL。我已经有一个查询可以完成其中的一个重要部分:
从表comments中获取最新的父行,对于每个父评论,获取孩子的cmets并按最旧的排序。 注意:有一个名为parent_id 的列。所有父母都是0,当然所有孩子都大于0。
此外,它还在名为create_date
这是非常可行的,因为父级和子级都在create_date 上排序(即使一个是 ASC,一个是 DESC)。
现在我想为用户添加按“顶级”cmets 排序的选项,而不仅仅是我在这里所做的“最新”:
SELECT * FROM (
SELECT c1.*, c1.create_date ac, c1.create_date ap FROM comments c1
WHERE parent_id = 0 AND c1.profile_id = 582
UNION
SELECT c2.*, c2.create_date ac, p.create_date ap FROM comments c2
JOIN comments p ON c2.parent_id = p.id
WHERE c2.profile_id = 582
) c
ORDER BY c.ap DESC, c.ac ASC;
所以需要注意的是,现在我想按名为 votes (DESC) 的列对父母进行排序,而孩子(或评论回复)与上述相同:create_date ASC。
我尝试过子查询、ORDER BY 和 CASE 语句等等。我需要为这一排序修改做什么?
注意:性能很好,但不是这里最大的问题。另外,我知道我可以通过外部查询通过代码+循环来做到这一点——但如果可能的话,我宁愿不走那条路。
【问题讨论】:
-
SELECT c1.*, c1.create_date ac, c1.create_date ap FROM cmets c1 WHERE parent_id = 0 AND c1.profile_id = 582,这部分在做什么?是父评论还是子评论?而且我不明白您是如何获得家长评论的?我本来以为,你有这样的条件:comment.id = 0,表示评论是父母......但是像你有comment.parentId = 0这样的接缝表示评论是父母??
-
@Sarhang 这部分得到了所有的父母。联合下方的 SELECT 将子 cmets 连接到父节点。
-
@kickingLettues,我删除了我的答案,因为它是错误的,你自己想出了答案,干得好。
-
@Sarhang 感谢您的帮助。我已经添加了我的答案,如果有任何反馈,我很乐意听到。
标签: mysql sql sorting parent-child