具有子条件的Mysql IN查询

时间:2011-06-23 07:43:09

标签: mysql

我有两个名为cities和cfgval的表 如果siteid条件为true,那么我查询第二部分

SELECT cfgval FROM sitecfg where cfg='affiliate_sitecityidlock' and siteid=24

将返回"18,20,12,15,22,4,3,9,"

带有逗号的尾随逗号,我已使用
删除了这个 SELECT TRIM(TRAILING ',' FROM查询。 但是,当我将所有查询放在一起时,它只返回一行,我的查询显示在下面

select * from cities  where siteid=0 and id 
IN(
   SELECT TRIM(TRAILING ',' FROM
     (SELECT cfgval FROM sitecfg where cfg='affiliate_sitecityidlock' 
       and siteid=24)
     )
  )

如果我用直接值代替,即 select * from cities where siteid=0 and id IN(18,20,12,15,22,4,3,9)它将返回所有行,我遇到了这个问题

3 个答案:

答案 0 :(得分:0)

我想我知道你的问题是什么:你认为sub select会返回一个逗号分隔的id列表,你必须修剪最后一个逗号......不要试试这个:

select * from cities
where siteid=0 
and id IN (SELECT cfgval FROM sitecfg where cfg='affiliate_sitecityidlock' and siteid=24)

答案 1 :(得分:0)

如果cfgval返回带逗号分隔列的单行,则可以使用FIND_IN_SET()函数:

SELECT * 
FROM cities
WHERE siteid=0 
  AND FIND_IN_SET(id, (
   SELECT SUBSTRING(cfgval, 2)
   FROM sitecfg 
   WHERE cfg='affiliate_sitecityidlock' 
       AND siteid=24
    )
  )

注意:由于这是使用函数,因此无法使用索引,您应该考虑将cfgval存储在多行中。

答案 2 :(得分:0)

据我所知,您的查询应该如下所示

SELECT * FROM cities WHERE siteid=0 AND LOCATE(CONCAT(',', id, ','),
CONCAT(',', (SELECT cfgval FROM sitecfg WHERE cfg='affiliate_sitecityidlock' AND siteid=24))