簡體   English   中英

MySQL檢查行中是否存在值,以減號分隔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM