我有product table
下面的数据库设计。
+-------+-----------+
| 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 :(得分: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);
将返回:
+-------+-----------+
| ID | Size |
+-------+-----------+
| 2 | 2,6,8 |
| 3 | 3,7,9 |
| 4 | 5,8,11 |
+-------+-----------+
重复两次值可以返回单个值:
CALL findsetrange(7,7);
+-------+-----------+
| ID | Size |
+-------+-----------+
| 3 | 3,7,9 |
+-------+-----------+
目前结果集保留在临时表fsr_res
中,您可以在进一步查询时使用该表。