Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用联接的mysql查询可能的规范化_Php_Mysql - Fatal编程技术网

Php 使用联接的mysql查询可能的规范化

Php 使用联接的mysql查询可能的规范化,php,mysql,Php,Mysql,我问了一个问题,要让孩子的父母一直到第六个父母。查询工作正常。但是我只是想知道是否有更好的范围通过更好的查询来实现结果,因为将来如果我想得到父7和父8,我需要修改这段代码,并且随着父ID的增加,这段代码会很长。此外,如果任何事情都可以通过php,这将是伟大的太 SELECT u.referred_by as parent_1, c1.referred_by as parent_2, c2.referred_by as parent_3, c3.referred_b

我问了一个问题,要让孩子的父母一直到第六个父母。查询工作正常。但是我只是想知道是否有更好的范围通过更好的查询来实现结果,因为将来如果我想得到父7和父8,我需要修改这段代码,并且随着父ID的增加,这段代码会很长。此外,如果任何事情都可以通过php,这将是伟大的太

SELECT
    u.referred_by as parent_1,
    c1.referred_by as parent_2,
    c2.referred_by as parent_3,
    c3.referred_by as parent_4,
    c4.referred_by as parent_5,
    c5.referred_by as parent_6
FROM
    users u
LEFT JOIN users c1
    ON  c1.id=u.referred_by
LEFT JOIN users c2
    ON c2.id = c1.referred_by
LEFT JOIN users c3
    ON c3.id = c2.referred_by
LEFT JOIN users c4
    ON c4.id = c3.referred_by
LEFT JOIN users c5
    ON c5.id = c4.referred_by
WHERE u.id = 30
SQL小提琴

http://sqlfiddle.com/#!2/24694/1

你可以在你的作品中使用递归。下面是一个简单的递归代码,返回所有祖先,但如果您想限制希望返回的父级的数量,可以使用下面的代码创建一个函数,并将参数6(或7)作为参数发送,然后检查是否达到特定的父级。希望它能起作用。:)


你好,谢谢你的回答。对于用户id和父id,我只使用一个表,即用户id和父id,用户id是id,父id由\u引用。因此,您给出的查询实际上并不符合我的数据库结构User1001176:我知道您只使用了一个表,实际上我也使用了一个表(users)。parents只是一个与其自身(parents)连接的“with”语句。此解决方案仅在sql server中有效,因为我使用了mysql.EMM中不支持的“with”子句。。这是一个mysql问题,哈哈。我也加了标签
with parents as (
   select id, referred_by
   from users 
   where id = 30
   union all
   select u.id, u.referred_by
   from users u
     join parents p on p.id = u.referred_by
) 
select *
from parents;