2014-06-17 26 views
-3

我有如下數據庫設計,如下面的product table如何在逗號分隔字段的範圍中查找值MYSQL

+-------+-----------+ 
| ID |  Size | 
+-------+-----------+ 
| 1  | 1,2,4 | 
| 2  | 2,6,8 | 
| 3  | 3,7,9 | 
| 4  | 5,8,11 | 

現在我想在兩個值之間的大小的id。

例如我需要5到8之間的產品大小,那麼它應該返回2,3,4行。

任何人都可以指導我如何做到這一點?

在此先感謝。

+0

我假設正常化數據庫不是一個選項? – Mureinik

+0

你需要澄清更多。你想要什麼? – Darren

+5

對不起,但逗號分隔的值不是關係數據庫可以正常使用的值。爲了在此查詢中獲得任何類型的性能(或簡單性),您需要更改數據模型。 –

回答

0

如果你發現自己處於這種情況,你已經把自己塗在角落裏。第一種方法是將單列中的CSV分成更合理的佈局;例如:

+----+------+ 
| ID | Size | 
+----+------+ 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 4 | 
| 2 | 2 | 
| 2 | 6 | 
| 2 | 8 | 
and so on... 

據我所知,在現實生活中,這可能並不總是可能的,在這種情況下,你需要少一點複雜的方法。如果您在尺寸搜索有限範圍,你可以使用stored procedures來解決這個問題:

CREATE PROCEDURE findsetrange (IN a INT, IN b INT) 
BEGIN 
DECLARE i INT; 

DROP TEMPORARY TABLE IF EXISTS fsr_temp; 
CREATE TEMPORARY TABLE fsr_temp (id int); 

SET i=a; 

WHILE (i<=b) DO 

    INSERT INTO fsr_temp (id) VALUES (i); 

    SET i=i+1; 
END WHILE; 

DROP TEMPORARY TABLE IF EXISTS fsr_res; 
CREATE TEMPORARY TABLE fsr_res 
    SELECT ProductTable.* FROM ProductTable 
    JOIN (
    SELECT DISTINCT ProductTable.id 
     FROM fsr_temp 
     JOIN ProductTable ON (find_in_set(fsr_temp.id,ProductTable.a)) 
    ) as p ON (p.id=ProductTable.id); 

DROP TEMPORARY TABLE IF EXISTS fsr_temp; 

SELECT * FROM fsr_res; 

END 

此存儲過程就可以被稱爲需要檢索範圍。爲了配合你的問題,你可以使用

CALL findsetrange(5,8); 

將返回:

CALL findsetrange(7,7); 

+-------+-----------+ 
| ID |  Size | 
+-------+-----------+ 
| 3  | 3,7,9 | 
+-------+-----------+ 

目前結果集的臨時留:

+-------+-----------+ 
| ID |  Size | 
+-------+-----------+ 
| 2  | 2,6,8 | 
| 3  | 3,7,9 | 
| 4  | 5,8,11 | 
+-------+-----------+ 

單值可以通過重複值的兩倍返還表fsr_res,您可以使用它進一步查詢。