MySQL检查行中是否存在值,以减号分隔

时间:2012-01-16 19:15:26

标签: php mysql

我有一张表格,其中ProductIDs和相关的附件ID由负号分隔。

 ProductId    Accessories
 1            1-2-3-
 2            3-4-
 3            1-2-3-
 4            2-3-

如何获得附件ID = 2

的ProductIds

我尝试了这个查询,但它无法正常工作

SELECT *
FROM `products`
WHERE '-' + Accessories + '-' LIKE '%-2-%'
LIMIT 0 , 30

无法更改数据库。

4 个答案:

答案 0 :(得分:8)

如果你绝对不得不做这种令人难以置信的糟糕做法,这会让你的编码生活变得复杂,直到你退休的那一天:

SELECT * 
  FROM products 
 WHERE CONCAT('-',Accessories) LIKE '%-2-%' 
  LIMIT 0 , 30 

答案 1 :(得分:2)

虽然以下解决方案在使用索引时也存在问题,但我想将其添加为完整性:

SELECT *
  FROM `products` 
 WHERE find_in_set('2', replace(`accessories`, '-', ','))
 LIMIT 0, 30;

<强>解释

replace(accessories, '-', ',')将附件列表转换为以逗号分隔的列表,例如1-2-3-将转换为1,2,3,

然后可以使用

find_in_set(value, set)查看value中是否包含set

正如我先前所说,不能使用任何索引,但应该在实时数据集上测量性能。

答案 2 :(得分:0)

我觉得你差不多了。试试这个:

SELECT *
FROM products
WHERE Accessories LIKE '%-2-%'
LIMIT 0 , 30

答案 3 :(得分:0)

假设这些值总是有一个尾随破折号,那么你有几个案例要涵盖:

1)单值:... WHERE Accessories = CONCAT($value, '-')
2)开始时的价值:... WHERE Accessories LIKE '$value-%'
3)中间值:... WHERE Accessories LIKE '%-$value-%'
4)最后的价值:... WHERE Accessories LIKE '-$value-$'

最终会在完整的(呃)SQL中出现这个:

SELECT ...
FROM ...
WHERE 
    (Accessories = CONCAT($value, '-')) OR             // single
    (Accessories LIKE CONCAT($value, '-%')) OR         // start
    (Accessories LIKE CONCAT('%-', $value, '-%')) OR   // middle
    (Accessories LIKE CONCAT('%-', $value, '-'))       // end