我有一个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
答案 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