3

我有一张这样的桌子:

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

4

3 回答 3

2

不要认为这对数据库来说是个好主意。查询会有点困难。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

于 2013-03-18T12:15:41.273 回答
0

我终于发疯了,但它的工作原理,是这样的:

select first type
foreach first type
__select second type where id = first type
__foreach second type
于 2013-03-19T13:20:06.483 回答
0

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

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;
于 2013-04-09T21:30:44.870 回答