我有一张表格,其中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
无法更改数据库。
答案 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