我正在使用MySQL。我已经有一个查询,它执行了一个重要的部分:
从表comments
获取最新的父行,并为每个父评论获取孩子的评论并按最早的评论排序。 注意:有一个名为parent_id
的列。所有父母都是0
,所有孩子当然都大于0
。
此外,它正在对名为create_date
这是非常可行的,因为父和子都在create_date
上排序,(即使一个是ASC,一个是DESC)。
现在我想为用户添加选项,以排序" top"评论,而不仅仅是"最新的"正如我在这里做的那样:
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
语句以及更多的子查询。我需要为这一次排序修改做些什么?
注意:性能很好,但不是这里的最大问题。另外,我知道我可以通过代码+循环来执行此操作,但是我不想在可能的情况下使用该路由。
答案 0 :(得分:1)
SELECT * FROM
(
SELECT c1.*, c1.vote_count totals, c1.parent_id pa_id, c1.id p_id, c1.create_date ac, c1.create_date ap FROM comments c1
WHERE parent_id = 0 AND c1.profile_id = 582
UNION
SELECT c2.*, p.vote_count totals, p.parent_id pa_id, p.id p_id, 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.totals DESC,
CASE
WHEN c.pa_id = 0 THEN c.p_id
ELSE c.parent_id
END ASC,
c.ac ASC
我只是创建了一个名为totals
的新别名列,该列基本上将父亲的投票计数分配给孩子,以便他们一起排序。
编辑:我还必须添加父评论的ID和父ID用于排序,CASE
ORDER BY
语句中使用了该ID