MySQL父子一查询选择

标签 mysql

我有一个包含如下字段的 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

最佳答案

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

关于MySQL父子一查询选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16808784/

相关文章:

mysql - 按月进行群组分析 - MySQL

mysql - postgresql 中的 "Subquery must return only one column"错误

java - 使用 hibernate 和 mysql 自动生成时,表创建的 SQL 不正确

php - shop_item_id 必须有效

php - 如何使用php将记录插入sql数据库上的多对多关系表?

php - 查询以检索 Laravel 5.2 中历史表中的最新条目

mysql - SQL - 获取不存在的行

php - 连接到多个数据库

mysql - Angular Material 日期选择器未从 Laravel API 响应中预填充值

mysql - 调整对索引的查询