在哪里使用子查询不按预期工作

时间:2014-06-13 11:35:29

标签: mysql sql subquery where-in in-subquery

我正在尝试使用我创建的父路径从我的类别表中获取结果。 当我使用手动数据启动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)

先谢谢,

此致

2 个答案:

答案 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表达式,而其他所有内容都保持不变。

Demo

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