我得到一张下表:
col1 | col2 | col3 -----+------+------- 1 | a | 5 5 | d | 3 3 | k | 7 6 | o | 2 2 | 0 | 8
如果用户搜索“ 1”,则程序将查看col1具有“ 1”的,然后它将在col3“ 5”中得到一个值,然后程序将继续在其中搜索“ 5”,col1并且将得到“ 3”在中col3,依此类推。因此它将打印出:
col1
col3
1 | a | 5 5 | d | 3 3 | k | 7
如果用户搜索“ 6”,它将打印出:
6 | o | 2 2 | 0 | 8
如何建立一个SELECT查询来做到这一点?
SELECT
编辑
@leftclickben提到的解决方案也是有效的。我们也可以对它使用存储过程。
CREATE PROCEDURE get_tree(IN id int) BEGIN DECLARE child_id int; DECLARE prev_id int; SET prev_id = id; SET child_id=0; SELECT col3 into child_id FROM table1 WHERE col1=id ; create TEMPORARY table IF NOT EXISTS temp_table as (select * from table1 where 1=0); truncate table temp_table; WHILE child_id <> 0 DO insert into temp_table select * from table1 WHERE col1=prev_id; SET prev_id = child_id; SET child_id=0; SELECT col3 into child_id FROM TABLE1 WHERE col1=prev_id; END WHILE; select * from temp_table; END //
我们使用临时表存储输出结果,并且由于临时表是基于会话的,因此不会有关于输出数据不正确的任何问题。
SQL FIDDLE Demo
试试这个查询:
SELECT col1, col2, @pv := col3 as 'col3' FROM table1 JOIN (SELECT @pv := 1) tmp WHERE col1 = @pv
**[
](http://sqlfiddle.com/#!2/9635d2/1)**
| COL1 | COL2 | COL3 | +------+------+------+ | 1 | a | 5 | | 5 | d | 3 | | 3 | k | 7 |
注释 parent_id值应小child_id于此解决方案的。
parent_id
child_id