如何在逗号分隔的字段MYSQL中查找范围内的值

时间:2014-06-17 05:45:44

标签: php mysql

我有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行。

有谁能指导我怎么做?

提前感谢。

1 个答案:

答案 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中,您可以在进一步查询时使用该表。