【问题标题】:Getting child-parent rows from same table; sort by different criteria based on row从同一个表中获取子父行;根据行按不同的标准排序
【发布时间】: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 BYCASE 语句等等。我需要为这一排序修改做什么?

注意:性能很好,但不是这里最大的问题。另外,我知道我可以通过外部查询通过代码+循环来做到这一点——但如果可能的话,我宁愿不走那条路。

【问题讨论】:

  • 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


【解决方案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 用于排序目的,这在 ORDER BY 中的新 CASE 语句中使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2021-11-05
    • 2016-12-29
    • 1970-01-01
    • 2021-11-25
    • 2017-05-17
    相关资源
    最近更新 更多