5

我有一个 MySQL 表,其字段如下:

id            name             parent
1             Fruit             0
2             Meat              0
3             Orange            1
4             Beef              2

其中 parent 字段表示上层 id。例如 Fruit id 是 1,Orange 是水果之一,所以 parent 是 1。

但是我想做一个高效的 MySQL 查询来获取格式为 parent->children->parent->children 的所有记录。我怎样才能做到这一点?

查询的结果记录应如下所示:

id            name             parent
1             Fruit             0
3             Orange            1
2             Meat              0
4             Beef              2
4

4 回答 4

11

您需要一个 mysql 不支持的递归连接。您唯一能做的就是确定最大深度级别(我的情况是 1,因为您有 p->c),这样您就可以确定所需的连接数:

最大深度 = 自连接数

SELECT
    p.id as parent_id,
    p.name as parent_id,
    c1.id as child_id,
    c1.name as child_name
FROM 
    my_table p
LEFT JOIN my_table c1
    ON c1.parent = p.id
WHERE
    p.parent=0

例如,如果您的最大深度级别为 3,则您需要 3 个自连接:

SELECT
    p.id as parent_id,
    p.name as parent_id,
    c1.id as child_id_1,
    c1.name as child_name_1,
    c2.id as child_id_2,
    c2.name as child_name_2,
    c3.id as child_id_3,
    c3.name as child_name_3
FROM 
    my_table p
LEFT JOIN my_table c1
    ON c1.parent = p.id
LEFT JOIN my_table c2
    ON c2.parent = c1.id
LEFT JOIN my_table c3
    ON c3.parent = c2.id
WHERE
    p.parent=0
于 2013-05-29T08:30:45.737 回答
3

这个怎么样?

select * from foods
order by (case parent when 0 then id*1000 else parent*1000+id end), id

这不是很好,因为如果你有超过 1000 种食物和同一个父母,它就行不通,但如果你知道这个限制,它应该可以解决问题。

于 2013-05-29T08:31:55.567 回答
1

这是获得您正在寻找的结果的另一种选择。您可以通过父级的 id 将父级和子级分组在一起,然后指示哪个记录是父级 (isparent) ... 如下所示:(此示例假定父级记录的父级为 NULL 值.. 而不是 0..但它也可以与 0 一起使用)

SELECT
    IFNULL(parent,id) AS parentid,
    IF(parent IS NULL,1,0) AS isparent,
    name
FROM my_table
ORDER BY
    parentid ASC, <- groups/orders all parentid's together
    isparent DESC, <- orders the parent first
    id DESC <- orders children by their id next

其余的应该很容易弄清楚,对你的输出进行分组等。

于 2016-04-27T15:08:12.307 回答
-1

您可以使用以下查询UNION

SELECT ID, NAME, PARENT
FROM MY_TABLE AS A,
     MY_TABLE AS B
WHERE A.PARENT != 0 AND
      A.PARENT = B.ID
UNION
SELECT ID, NAME, PARENT
FROM MY_TABLE
WHERE PARENT == 0
于 2016-03-29T09:02:15.893 回答