【问题标题】:MySql: order record by id and parentMySql:按id和父顺序记录
【发布时间】:2016-04-21 19:08:57
【问题描述】:

我有一张这样的桌子

CREATE TABLE `Table1` (
`id` INT NOT NULL AUTO_INCREMENT,
`parent` INT NOT NULL,
`comment` TEXT,
PRIMARY KEY(`id`)
);

其中有以下示例数据(评论字段中有一些用户生成的文本)

+------+---------+-
| id   | parent  |
+------+---------+
| 1    |    0    |
| 2    |    1    |
| 3    |    0    |
| 4    |    1    |
| 5    |    0    |
| 6    |    5    |
| 7    |    4    |
+------+---------+ 

如何在 SELECT 语句中获得以下顺序。

+------+---------+-
| id   | parent  |
+------+---------+
| 1    |    0    |
| 2    |    1    |
| 4    |    1    |
| 7    |    4    |
| 3    |    0    |
| 5    |    0    |
| 6    |    5    |
+------+---------+

我想在其父记录之后列出一条记录,并且父记录为 0 的行应根据其“id”进行排序。

【问题讨论】:

  • 不清楚你能解释一下你所追求的排序逻辑吗?
  • 您确定不希望父级为 0 的行在顶部,然后像其他行一样按 id 排序?我看不出这种排序有什么用。如果您根据值应用不同的排序规则......那么它并没有真正排序
  • MySQL 不是为做这些事情而设计的,最好在通过数组循环提取数据之后再做。
  • 我同意之前的评论。 SQL 排序顺序逻辑期望有一个明确的值,结果应该按照该值进行排序。在后者select 中没有这样的东西。顺便说一句,我认为表结构也有点冒险或不清楚;如果parent 值不能为空并且它指向同一个表,那么插入的第一行的父值是多少? (我知道没有定义引用完整性,但是当没有具有该 ID 的行时,0 父引用可能会在以后给您带来麻烦。)
  • @ AbhikChakraborty 我想根据站点用户发布的评论对站点用户发布的 cmets 进行排序。 @Toaster我确信“我不希望所有行与父0一起并且开始”。 @Jester 我不确定你是否正确。我只是在寻找解决方案。 @MJV 一个记录可以有父为0,如果它没有父。

标签: mysql


【解决方案1】:

因此,如果我理解正确,您的 cmets 结构为一棵树(根为 0,其他人都有父级并最终链接到 0)。 我不知道您使用哪种 sql 技术,但 Oracle 提供了一种按顺序显示树元素的方法。

查找“start with”和“connect by”,例如这里: http://www.adp-gmbh.ch/ora/sql/connect_by.html

我认为这可以帮助你实现你想做的事情

类似的东西(根本没有测试,只是一个提示)

select * from Table1 start with 0 connect by parent

编辑

由于您实际使用 MySQL,因此上述解决方案是不可能的(感谢@MJV 的注意)。 这是一个解决方案的想法。它假定您可以在插入新评论时在表格中添加更多信息。它还假设新评论的 ID 将高于其父评论(以便轻松排序。您的示例似乎假设相同)

您可以为表格中的每条评论添加 root_parent(最高父级):

+------+---------+-------------+
| id   | parent  | root_parent |             Corresponding trees
+------+---------+-------------+
| 1    |    0    |      1      |         1         3          5
| 2    |    1    |      1      |        / \                  / 
| 3    |    0    |      3      |       /   \                /  
| 4    |    1    |      1      |      2     4              6 
| 5    |    0    |      5      |           / 
| 6    |    5    |      5      |          /
| 7    |    4    |      1      |         7
+------+---------+ ------------+

现在,您可以致电订购

select * from table1 order by root_parent, id

让我知道它是否有效

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多