[英]MySQL check if value exist in row, separated by minus
我有一個表格,其中包含產品ID和相關的附件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
數據庫無法更改。
如果您絕對必須這樣做,那么非常糟糕的做法會使您的編碼工作復雜化,直到退休之日:
SELECT *
FROM products
WHERE CONCAT('-',Accessories) LIKE '%-2-%'
LIMIT 0 , 30
盡管以下解決方案在使用索引方面也存在問題,但我還是想添加它以確保完整性:
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)
來查看set
是否包含value
。
就像我之前說的,不能使用任何索引,但是應該根據實時數據集來衡量性能。
我想您幾乎已經擁有了。 嘗試以下方法:
SELECT *
FROM products
WHERE Accessories LIKE '%-2-%'
LIMIT 0 , 30
假設這些值總是帶有一個短橫線,那么您將涉及以下幾種情況:
1)單值: ... WHERE Accessories = CONCAT($value, '-')
2)開始時的值: ... WHERE Accessories LIKE '$value-%'
3)中間值: ... WHERE Accessories LIKE '%-$value-%'
4)最后的值: ... WHERE Accessories LIKE '-$value-$'
最終在完整的(er)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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.