Mysql 其中,子查询未按预期工作
我试图使用我创建的父路径从类别表中获取结果。 当我启动带有手动数据的请求时,它工作得非常好。 当我使用子查询动态地尝试相同的请求时,我只得到一个结果,而不是预期的4个结果。 我不明白为什么,你能帮我吗 提前谢谢你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
关于,在中使用带有逗号分隔列表的
,并不能满足您的需要。即使在使用子查询时也是如此。你可以试试这个:
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))