0

我正在尝试使用我创建的父路径从我的类别表中获取结果。当我使用手动数据启动请求时,它运行良好。当我使用子查询动态尝试相同的请求时,我只得到一个结果而不是预期的 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)

预先感谢,

问候,

4

2 回答 2

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 有一个内置的列表数据结构。它被称为表。

于 2014-06-13T11:41:22.693 回答
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,而其他一切都保持不变。

演示

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

于 2014-06-13T11:46:16.097 回答