我正在尝试使用我创建的父路径从我的类别表中获取结果。 当我使用手动数据启动WHERE IN请求时,它可以正常工作。 当我使用子查询动态尝试相同的请求时,我只得到一个结果而不是4个预期。 我不明白为什么,你能帮助我吗?
http://sqlfiddle.com/#!2/88b68/6
/*Working query*/
SELECT t.id_categorie FROM t
WHERE t.id_categorie IN (1396,1399,1403,1412)
/*Not working by subquery ??*/
SELECT cat.id_categorie FROM t as cat
WHERE
cat.id_categorie IN (SELECT REPLACE(t.path,'.',',') FROM t WHERE t.id_categorie = 1412)
先谢谢,
此致
答案 0 :(得分:1)
将in
与逗号分隔列表一起使用并不能达到您想要的效果。即使你使用子查询。你可以试试这个:
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有一个内置的列表数据结构。它被称为表。
答案 1 :(得分:1)
这不起作用的原因是你的内部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))
我所做的是通过调用IN
替换查询中的find_in_set
表达式,而其他所有内容都保持不变。
但是,此解决方案存在根本缺陷,因为它在单个列中存储多个值以表示多对多关系。实现此要求的更好方法是使用一个单独的表,将表的行连接到相关的行。