Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 SQL由或连接的多个中间值_Mysql_Sql - Fatal编程技术网

Mysql SQL由或连接的多个中间值

Mysql SQL由或连接的多个中间值,mysql,sql,Mysql,Sql,我在mySQL数据库中以嵌套集的形式存储了一个层次结构,并希望找到一个节点的所有父节点,我可以这样做: SELECT id FROM nested_set WHERE 837461 BETWEEN lft AND rgt; 但我想对潜在的大量节点(比如10000个)执行此操作。我可以通过将一组中间词链接在一起来实现这一点,例如 SELECT id FROM nested_set WHERE 44102 BETWEEN lft AND rgt OR 837461 BETWEEN

我在mySQL数据库中以嵌套集的形式存储了一个层次结构,并希望找到一个节点的所有父节点,我可以这样做:

SELECT id FROM nested_set WHERE 837461 BETWEEN lft AND rgt;
但我想对潜在的大量节点(比如10000个)执行此操作。我可以通过将一组中间词链接在一起来实现这一点,例如

SELECT id FROM nested_set WHERE 
    44102 BETWEEN lft AND rgt OR
    837461 BETWEEN lft AND rgt OR
    164462 BETWEEN lft AND rgt OR
    566562 BETWEEN lft AND rgt OR
    768916 BETWEEN lft AND rgt OR 
    ...


但这似乎非常乏味,我想可能会超过SQL语句的大小。有没有比创建一个包含10000条链式语句或语句的查询更有效的方法呢?

我不确定这是否是一种改进,甚至是解决方案,但我想试一试:正如我已经说过的,您可以使用一个临时表来存储节点

CREATE TEMPORARY TABLE nodes
                       (node integer,
                        INDEX (node));

INSERT INTO nodes
            (node)
            VALUES (44102),
                   (837461),
                   (164462),
                   (566562),
                   ...;
然后,您可以使用它通过内部联接执行
SELECT

SELECT ns.id
       FROM nested_set ns
            INNER JOIN nodes n
                       ON n.node BETWEEN ns.lft
                                         AND ns.rgt);
请注意,如果节点不是唯一的,或者多个给定节点位于同一范围内,则可能需要使用
DISTINCT

另一种方法是使用
存在

SELECT ns.id
       FROM nested_set ns
       WHERE EXISTS (SELECT *
                            FROM nodes n
                            WHERE n.node BETWEEN ns.lft
                                                 AND ns.rgt);
临时表上的索引可能支持性能。对于表
nested\u集
,我会尝试在
(lft,rgt,id)
(lft,rgt)
或至少在
(lft)
上建立索引

当然,您也可以使用
UNION-ALL
s的派生表,如

...    
(SELECT 44102 node
 UNION ALL
 SELECT 837461 node
 UNION ALL
 SELECT 164462
 UNION ALL
 SELECT 566562
 ...) nodes
...

加入或从中选择存在。但这样就没有临时表中的支持索引了。但是,对于较小的集合,该索引无论如何可能没有那么大的权重。

在什么情况下,所选节点不会出现在结果中?该层次结构是一个分叉层次结构(实际上,www.onezoom.org上的生物“生命树”)。查询选择继承人权限中一组提示的父项。例如,所有的动物都在lft=759126和rgt=2123179之间。如果查询仅包含“动物”编号,则不会返回任何植物(左=117464,rgt=507078)。但是在动物中也会有大量的“姐妹组”没有被返回——例如,如果查询中没有猿(lft=837457,rgt=837467),那么这些节点(不仅仅是尖端,还有稍微高一点的簇)都不会被返回。嗯,除非在这些文本后面有一个模式,我看不到,这允许它们以某种方式生成,我想你必须以这种或那种方式写下所有的文字。可以选择的方法是在(临时)表中插入常量,然后对该表中的集合进行更通用的查询(可能使用联接或
EXISTS
)。但是您仍然必须在
INSERT
语句中写入所有的文本。您必须使用SQL吗?我认为使用像Neo4j这样的图形数据库可以更好地解决这个问题。谢谢@stickybit。我想我必须写下所有的文字,但是它们都使用相同的
lft
rgt
列,所以我觉得可能有一种更简洁(可能更有效)的方式用SQL来表达它。