我想从我的表中选择数据并使用其中一列,创建一个循环来定义其他数据。
例如:
'select id,related_id,name from ancestors'
id, related_id, name
1, 0, Bob
2, 1, Dave
3, 2, Susie
4, 1, Luke
5, 0, Cindy
6, 5, Sam
Bob是祖父,Dave和Luke是他的孩子,Susie是他的孙女。 Cindy有个孩子Sam。
现在,我想使用related_id
来确定祖先树落下的级别。所以我希望结果如下:
id, related_id, name, level
1, 0, Bob, 0
2, 1, Dave, 1
3, 2, Susie, 2
4, 1, Luke, 1
5, 0, Cindy, 0
6, 5, Sam, 1
我想创建一个类似的查询:
select id,related_id,name from ancestors;
while related_id<>0 do level=level+1;
select related_id from ancestors where id=related_id end;
循环树并计算个人在他/她树内的等级。
这是我的实施。我似乎无法使用get_level。我得到一个错误,我不能在fetchall上使用boolean。有什么问题?
$connection->exec('
DELIMITER $$
DROP FUNCTION IF EXISTS `get_level` $$
CREATE FUNCTION `get_level`(VAR int(11)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE level int(11);
DECLARE parent int(11);
set level=0;
set parent=(select related_id from category where id=VAR);
while parent>0 DO
set level=level+1;
set parent=(select related_id from category where id=parent);
END
WHILE;
return level;
END$$
DELIMITER;');
$fetch=$connection->query('select *,get_level(id) as level from category')->fetchall(pdo::FETCH_UNIQUE|pdo::FETCH_ASSOC);
print_r($fetch);
答案 0 :(得分:0)
你可以创建mysql函数来获取记录级别,然后在你的查询中调用它。 函数输入将是记录ID并输出级别号。 功能将是这样的
DELIMITER $$
DROP FUNCTION IF EXISTS `getlevel` $$
CREATE FUNCTION `get_level`(Id int(11)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE levelNumber int(11); -- declare variable to record level
DECLARE parent int(11); -- declare variable to hold the parent id
set levelNumber = 0; -- set the level to zero at the begining
set parent = (select `relation_column` from `table` where `id_column` = Id); -- get parent record of then id givin to function
while parent > 0 DO -- loop unitl parent = 0 or record has no parent
set levelNumber = levelNumber + 1; -- increase level by 1
set parent = (select `relation_column` from `table` where `id_column` = parent); -- re set parent id
END
WHILE;
return levelNumber; -- return then level number
END$$
DELIMITER ;
relation_column是保存记录关系的列。 id_column是保存记录ID或(主键)的列。
最终查询将是这样的
select `table`.`id_column`,`table`.`relation_column`,`table`.`name`,get_level(`table`.`id_column`) as "level" from `table`
希望这会有所帮助