从同一个表中获取子父行;根据行

时间:2017-11-18 23:07:41

标签: mysql sql sorting parent-child

我正在使用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 BYCASE语句以及更多的子查询。我需要为这一次排序修改做些什么?

注意:性能很好,但不是这里的最大问题。另外,我知道我可以通过代码+循环来执行此操作,但是我不想在可能的情况下使用该路由。

1 个答案:

答案 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