选择... in(column1)其中column1为' 1,4,7'

时间:2016-07-26 18:23:10

标签: mysql where

我需要在(X)'中执行'搜索X的值是表中逗号分隔的值列表。

表1:

itemId   colors(nvarchar)
 1          1, 3
 2          2

表2:

colorId colorName
   1      Red
   2      Yellow
   3      Blue

我正在寻找这种输出......

itemId colorName
  1     Red
  1     Blue

我试过了,但我认为内部Select需要返回多行才能正常工作,而不是一行的值是逗号分隔值。

select itemId, colorName 
from Table1 t1
left join Table2 t2 on t2.colorId in (select colors from Table1 where itemId = 1)
where itemId = 1;

2 个答案:

答案 0 :(得分:0)

可以使用find_in_set

select itemId, colorName 
from Table1 t1
left join Table2 t2 on  find_in_set(t2.colorId , t1.colors) > 0
where itemId = 1;

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

答案 1 :(得分:0)

在规范化的名称中,您应该将table1转换为

itemid | colorid
-------+--------
     1 |       1
     1 |       3
     2 |       2

这些以逗号分隔的字段不仅令人讨厌更新,而且find_in_set是我将尽可能避免的那些函数之一。 (因为有效地你在字符串中搜索一个数字,这通常意味着搜索字符串,这比仅使用建议的表并添加有用的索引效率低)

无论如何,如果您更改table_1,查询将是:

SELECT t1.itemid, t2.colorname
FROM table1 t1
LEFT JOIN table2 t2 USING (colorid)
WHERE t1.itemid=1
ORDER BY t1.itemid

如果您有任何机会需要颜色名称列表:

SELECT t1.itemid, GROUP_CONCAT(t2.colorname)
FROM table1 t1
LEFT JOIN table2 t2 USING (colorid)
WHERE ...
GROUP BY t1.itemid

将返回元组(1,“红色,蓝色”)和(2,“黄色”)。

(与GROUP_CONCAT(t2.colorid)类似)