SQL语法在彼此之下显示相关行?

时间:2015-09-20 11:57:13

标签: mysql

我有用于保留用户评论的表格。这就是它的样子:

╔══════╦════════════╦═════════════════╦══════╦════════╗
║  ID  ║    Name    ║     Comment     ║  Re  ║  Time  ║
╠══════╬════════════╬═════════════════╬══════╬════════╣
║  1   ║    Jack    ║   Nice Movie!   ║  0   ║  8:12  ║
║  2   ║    Smith   ║ Agree With That ║  1   ║  8:30  ║
║  3   ║    Bob     ║     Terrible    ║  0   ║ 10:15  ║
║  4   ║    Bill    ║       Yep       ║  1   ║  8:22  ║
║  5   ║    Will    ║This Movie Rocks ║  4   ║  9:31  ║
╚══════╩════════════╩═════════════════╩══════╩════════╝

我希望它是这样的:

╔══════╦════════════╦═════════════════╦══════╦════════╗
║  ID  ║    Name    ║     Comment     ║  Re  ║  Time  ║
╠══════╬════════════╬═════════════════╬══════╬════════╣
║  1   ║    Jack    ║   Nice Movie!   ║  0   ║  8:12  ║
║  4   ║    Bill    ║       Yep       ║  1   ║  8:22  ║
║  5   ║    Will    ║This Movie Rocks ║  4   ║  9:31  ║
║  2   ║    Smith   ║ Agree With That ║  1   ║  8:30  ║
║  3   ║    Bob     ║     Terrible    ║  0   ║ 10:15  ║
╚══════╩════════════╩═════════════════╩══════╩════════╝

如您所见第一条评论是回复0并按时间排序,其他回复另一条消息的评论被置于其下并按时间排序。

我怎样才能实现这样的目标?提前谢谢。

编辑1: 我有三个表:用户评论帖子,使用以下查询创建:

用户表

CREATE TABLE users(UID INT PRIMARY KEY, UName TEXT);

UID:用户ID

UName:用户名

帖子表

CREATE TABLE posts(PID INT PRIMARY KEY, PTitle TEXT, PBody TEXT, PDate DATETIME);

PID:帖子的ID

PTitle:保留帖子的标题

PBody:发布内容

PDate:撰写日期帖子

评论表

CREATE TABLE comments(CID INT PRIMARY KEY, UID INT, PID INT, Comment TEXT, Reply INT, CDate DATETIME);

CID:评论ID

UID:评论此评论的用户ID

PID:此评论与

相关的帖子ID

评论:评论文字

回复:此评论已被回复的评论ID

CDate:发送日期评论

1 个答案:

答案 0 :(得分:0)

你没有说你是否想要一个分级显示,它可以回复回复等等。这在纯MySQL中是一个痛苦的问题。如果您需要以某种方式将Re列构建为父级的路径,那么您最好。 (或者使用能够查询层次结构的dbms。)

确定一级评论/回复显示已经足够了,你可以试试这个。 (http://sqlfiddle.com/#!9/1b51ad/5/0)。它会将您的Re列(对于线程的原始注释为零)转换为Thread列。然后按线程进行排序,并在线程内按时间戳排序。这似乎很有用。

select case when re = 0 then id else re end thread,
       id, name, comment, re time
  from cmnt
 order by thread , time