用while循环选择mysql

时间:2018-04-24 10:16:47

标签: mysql while-loop

我想从我的表中选择数据并使用其中一列,创建一个循环来定义其他数据。

例如:

'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);

1 个答案:

答案 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` 

希望这会有所帮助