MySQL父子一个查询选择

时间:2013-05-29 08:19:41

标签: mysql

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

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

其中,父字段表示上级ID。例如,Fruit id为1,而Orange是其中一个水果,因此父级为1。

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

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

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

4 个答案:

答案 0 :(得分:8)

你需要一个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

答案 1 :(得分:2)

这个怎么样?

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

它不是很好,因为如果你有超过1000种含有同一父母的食物,它就不会起作用,但如果你知道这个限制,就应该这样做。

答案 2 :(得分:0)

这是获得您正在寻找的结果的另一种选择。您可以通过父级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

其余部分应该很容易理解,对输出进行分组等等。

答案 3 :(得分:-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