Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 其中,子查询未按预期工作_Mysql_Sql_Subquery_Where In_In Subquery - Fatal编程技术网

Mysql 其中,子查询未按预期工作

Mysql 其中,子查询未按预期工作,mysql,sql,subquery,where-in,in-subquery,Mysql,Sql,Subquery,Where In,In Subquery,我试图使用我创建的父路径从类别表中获取结果。 当我启动带有手动数据的请求时,它工作得非常好。 当我使用子查询动态地尝试相同的请求时,我只得到一个结果,而不是预期的4个结果。 我不明白为什么,你能帮我吗 提前谢谢你 关于,在中使用带有逗号分隔列表的,并不能满足您的需要。即使在使用子查询时也是如此。你可以试试这个: SELECT cat.id_categorie FROM t cat WHERE EXISTS (SELECT 1 FROM t

我试图使用我创建的父路径从类别表中获取结果。 当我启动带有手动数据的请求时,它工作得非常好。 当我使用子查询动态地尝试相同的请求时,我只得到一个结果,而不是预期的4个结果。 我不明白为什么,你能帮我吗

提前谢谢你


关于,

在中使用带有逗号分隔列表的
,并不能满足您的需要。即使在使用子查询时也是如此。你可以试试这个:

SELECT cat.id_categorie
FROM t cat
WHERE EXISTS (SELECT 1
              FROM t
              WHERE t.id_categorie = 1412 AND
                    find_in_set(cat.id_categorie, REPLACE(t.path, '.', ',')) > 0
             );

我不确定您的数据看起来像什么,甚至不确定这个查询应该做什么(子查询与外部查询位于同一个表上,这似乎很奇怪)。不过,通常情况下,您希望将内容存储在表中,而不是分隔的列表中。你看,SQL有一个内置的列表数据结构。它被称为表。

这不起作用的原因是您的内部
SELECT
生成一个逗号分隔的
VARCHAR
,而不是四个单独的整数

在MySQL中,您可以使用
find_In_set
,如下所示:

SELECT cat.id_categorie FROM t as cat
WHERE find_in_set(cat.id_categorie, (
  SELECT REPLACE(t.path,'.',',')
  FROM t WHERE t.id_categorie = 1412))
我所做的是将查询中的
中的
表达式替换为调用
find\u IN\u set
,其他内容保持不变


然而,这个解决方案从根本上说是有缺陷的,因为它在一列中存储多个值来表示多对多关系。实现此要求的更好方法是使用一个单独的表,将表中的行连接到它们的相关行。

这是因为
t.path
varchar
列,而不是
INT
。请参见FIND\u IN\u SET(),尽管这种问题可能是设计不良的症状。也就是说,物化路径是一种被接受的策略。感谢我的理解:-)我使用此解决方案来获取面包屑,而不是递归查询,您能再解释一下建议的更好的实践吗?@user3384179如果我正确理解您试图实现的目标,请检查,它们展示了如何在MySQL中实现与self的关系。
SELECT cat.id_categorie FROM t as cat
WHERE find_in_set(cat.id_categorie, (
  SELECT REPLACE(t.path,'.',',')
  FROM t WHERE t.id_categorie = 1412))