如果你發現自己處於這種情況,你已經把自己塗在角落裏。第一種方法是將單列中的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
,您可以使用它進一步查詢。
來源
2014-06-17 06:42:33
vhu
我假設正常化數據庫不是一個選項? – Mureinik
你需要澄清更多。你想要什麼? – Darren
對不起,但逗號分隔的值不是關係數據庫可以正常使用的值。爲了在此查詢中獲得任何類型的性能(或簡單性),您需要更改數據模型。 –