【问题标题】:Ordering MySQL results to obey parent/child订购 MySQL 结果以服从父/子
【发布时间】:2013-03-06 18:21:44
【问题描述】:

我有一张这样的桌子:

ID   NAME                     TYPE     PARENT
1    Letters of Jane Austen   book     0
2    Chapter 1                chapter  1
3    Chapter 2                chapter  1
4    Chapter 3                chapter  1
5    Title 1                  title    2
6    Title 2                  title    2

我想创建一个这样的有序表单:

[]Letters of Jane Austen
  []Chapter 1
    []Title 1
    []Title 2
  []Chapter 2
  []Chapter 3
[]Another book...

数据库中有很多书,而不仅仅是一本。

有没有办法以这种方式对查询“SELECT”进行排序? 这只是一个外观问题,不需要做多维数组或其他东西,因为我可以在标签上贴上它们的类型,然后根据类型更改它们的外观。但我需要以正确的顺序获取查询。

PD:对不起我的英语:S

【问题讨论】:

  • 我尝试使用 while + if 或 foreach 从 php 代码执行此操作,但我没有让它工作。但是我不是SQL专家,我认为带一个有序查询会更容易。
  • 我不是 mysql 专家,但如果是 sql server,我会在存储过程中使用游标来执行此操作。
  • 这不是 MySQL 任务。您需要编写一些单一用途的 PHP 递归函数。

标签: php sql select


【解决方案1】:

不要认为这对数据库来说是个好主意。查询会有点困难。 Imo 更好 - 您选择所有书籍,按顺序将其写入页面,然后使用 js 重新排序。

HTML 可能是这样的:

<div id="books">
    <div id="book_1" class="book" parent="0">Letters of Jane Austen</div>
    <div id="book_2" class="book" parent="1">Chapter 1</div>
    <div id="book_3" class="book" parent="1">Chapter 2</div>
    <div id="book_4" class="book" parent="1">Chapter 3</div>
    <div id="book_5" class="book" parent="2">Title 1</div>
    <div id="book_6" class="book" parent="2">Title 2</div>
</div>

那么做这个层次结构的js:

$(function () {
    $('#books .book').each(function () {
        var p = $(this).attr("parent");
        if ($('#book_' + p).length) {
            $(this).appendTo($('#book_' + p));
        }
    });
});

查看JSFiddle

更新

如果你希望它在非 js 客户端上正常工作,你可以使用 php 在后端重新排序,但解决方案不会那么漂亮:D

【讨论】:

    【解决方案2】:

    我终于发疯了,但它确实有效,像这样:

    select first type
    foreach first type
    __select second type where id = first type
    __foreach second type
    

    【讨论】:

      【解决方案3】:

      这种类型的表使用所谓的邻接列表模型。以下查询将适用于您:

      SELECT
          b.`id`,
          b.`name`,
          b.`type`,
          b.`parent`
      FROM `books` b
      LEFT JOIN `books` b2 ON b.`parent` = b2.`id`
      ORDER BY
          CASE
              WHEN b.`parent` = 0
              THEN b.`id`
              ELSE b.`parent`
          END,
          b.parent;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        相关资源
        最近更新 更多