MySQL中许多2多个的逐个子句

时间:2016-09-04 02:39:06

标签: mysql sql sql-order-by

我有这样的表/记录:

Table: COMMENTS
---------------------------------------------
COMMENT_ID | CONTENT            | CREATE_DATE
---------------------------------------------
      1    | Content 1          | 2016-09-01
      2    | Content 2          | 2016-09-02
      3    | Content 3          | 2016-09-03
      4    | Reply to Content 2 | 2016-09-04
      5    | Reply to Content 1 | 2016-09-05
      6    | Reply to Content 2 | 2016-09-03


Table: REPLY_COMMENTS
---------------------------------
COMMENT_ID | REPLY_TO_COMMENT_ID
---------------------------------
     4     |         2
     5     |         1
     6     |         2

我想显示这个顺序的记录:

---------------------------------------------
COMMENT_ID | CONTENT            | CREATE_DATE
---------------------------------------------
      1    | Content 1          | 2016-09-01
      5    | Reply to Content 1 | 2016-09-05
      2    | Content 2          | 2016-09-02
      6    | Reply to Content 2 | 2016-09-03
      4    | Reply to Content 2 | 2016-09-04
      3    | Content 3          | 2016-09-03

所以'回复'内容应该在父母的内容之下 - 但回复内容也应该在CREATE_DATE之前订购。

基本上,我想整理:内容并以CREATE_DATE的顺序回复。

我写了这样的查询:

SELECT  comment.*
FROM COMMENTS comment
LEFT JOIN REPLY_COMMENTS reply_comment ON reply_comment.COMMENT_ID = comment.COMMENT_ID

ORDER BY (SOMETHING SHOULD BE HERE), comment.CREATE_DATE ASC

我不能用我目前的知识编写order by子句 - 请帮帮我(我正在使用MySQL)。

只想使用 COMMENTS.CREATE_DATE字段 - 不想使用COMMENT_ID字段,因为它是主键(甚至可能吗?)。

1 个答案:

答案 0 :(得分:2)

SELECT t1.COMMENT_ID,
       t1.CONTENT,
       t1.CREATE_DATE
FROM COMMENTS t1
LEFT JOIN REPLY_COMMENTS t2
    ON t1.COMMENT_ID = t2.COMMENT_ID
ORDER BY COALESCE(t2.REPLY_TO_COMMENT_ID, t1.COMMENT_ID),
         t1.CREATE_DATE

<强>解释

ORDER BY子句使用两个术语进行排序。第一个COALESCE术语将返回父消息的COMMENT_ID(对于父母和单个后代子女)。这样做的原因是,对于子节点,它将使用连接的ID,对于父节点,查找NULL,它也将默认为父ID。第二个排序术语使用创建日期,假设所有对帖子的回复都将在原始帖子之后发生。