Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
MySQL,MariaDB:如何创建子-父层次递归查询?_Mysql_Sql_Mariadb - Fatal编程技术网

MySQL,MariaDB:如何创建子-父层次递归查询?

MySQL,MariaDB:如何创建子-父层次递归查询?,mysql,sql,mariadb,Mysql,Sql,Mariadb,我有以下MySQL查询: SELECT * FROM (SELECT * FROM paper ORDER BY id DESC) paper_sorted, (SELECT @pv := 26) initialisation WHERE find_in_set(id, @pv) AND length(@pv := concat(@pv, ',', last_id)) ORDER BY @pv ASC LIMIT 0,15 这在

我有以下MySQL查询:

SELECT * FROM (SELECT * FROM paper ORDER BY id DESC) paper_sorted,
        (SELECT @pv := 26) initialisation
        WHERE find_in_set(id, @pv)
        AND length(@pv := concat(@pv, ',', last_id))
        ORDER BY @pv ASC LIMIT 0,15

这在MySQL中工作得非常好;但是,我正在使用一个MariaDB数据库,而此查询不起作用。无论如何,要重写它,使其同时适用于MySQL和MariaDB吗

数据库架构:

CREATE TABLE paper (
    id INT,
    last_id INT
);

INSERT INTO paper VALUES (19, 0);
INSERT INTO paper VALUES (20, 19);
INSERT INTO paper VALUES (21, 20);
INSERT INTO paper VALUES (22, 21);
INSERT INTO paper VALUES (23, 19);
INSERT INTO paper VALUES (24, 23);
INSERT INTO paper VALUES (25, 23);
INSERT INTO paper VALUES (26, 24);
马里亚布五世。10.3.18; MySQL v。5.7.27

此SQL查询应获取所有父ID。 与示例查询一样,
@pv
变量是26,因此得到26->24->23->19


然而,这对MariaDB不起作用。它只返回一行,在MariaDB中是26行。如何重写此查询以同时适用于MariaDB和MySQL?

您应该能够将查询重写为一个查询。这些被添加到MariaDB 10.2中,并允许使用SQL查询分层数据结构

按照这些思路应该可以做到:

WITH RECURSIVE p AS (
    SELECT * FROM paper WHERE id = 26
    UNION
    SELECT c.* FROM paper AS c, p WHERE p.last_id = c.id
) SELECT * FROM p ORDER BY id ASC LIMIT 15;

编辑:如果需要SQL与旧版本向后兼容,可以使用存储过程来实现相同的结果

DELIMITER // ;

CREATE OR REPLACE PROCEDURE p1(IN id_in INT)
BEGIN
    DECLARE i INT DEFAULT id_in;
    CREATE OR REPLACE TEMPORARY TABLE results LIKE paper;

    WHILE i IS NOT NULL DO
          INSERT INTO results SELECT p.id, p.last_id FROM paper AS p WHERE p.id = i;
          SET i = (SELECT r.last_id FROM results AS r WHERE r.id = i LIMIT 1);
    END WHILE;

    SELECT * FROM results;
    DROP TEMPORARY TABLE results;
END;
//

DELIMITER ; //

MySQL和MariaDB的哪个版本?你能说出不工作是什么意思吗?错误消息?结果集中没有行吗?请回答您的问题。这个问题不清楚,因为我们不知道数据库版本。投票关闭。我将在几个小时内得到SQL DB的确切版本。我目前不确定,因为我目前无法访问它们。将在更新后回复此线程。10.3.18; MySQL v。5.7.27太好了,这对MariaDB有用!虽然使用递归仅适用于MySQL v。8+对于向后兼容性,我认为存储过程应该可以工作。