2014-07-25 22 views
0

我有这张表。MySql - 结合REGEXP和BETWEEN功能

 
+--------+----------------+ 
| id  | e_id   | 
+--------+----------------+ 
| 164462 | " 3 1 2 4 6 " | 
| 164463 | " 185 1 2 4 6 " | 
| 164464 | " 3 1 2 1140 6 "| 
| 164465 | " 52 1 2 4 6 " | 
| 164466 | " 3 1 175 4 6 " | 
| 164467 | " 3 1 2 4 6 " | 
| 164468 | " 3 1 2 4 6 " | 
| 164469 | " 3 1 2500 4 6 "| 
| 164470 | " 82 1 2 4 6 " | 
| 164471 | " 3 1 2 4 6 " | 
| 164472 | " 3 1 50 4 6 " | 
| 164473 | " 3 1 2 4 6 " | 
+--------+-----------------+

我必须找到行包含数字175和2574之间,但数字只是[[:space:]]分离。

我试图使用MySQL查询像这样:

select * 
    from table_name 
    where e_id between REGEXP '[[:space:]]175[[:space:]]' 
    and REGEXP '[[:space:]]2574[[:space:]]'; 

......和很多像这样的,但没有运气的组合...

感谢您的帮助:)!

回答

0

您不应该在单个数据库列中拥有这种“列表”。在这种情况下,您应该有另一个表格来一次链接一个e_id

无论如何,这是你的问题一个解决方案,如果边界不是动态:创建一个正则表达式175和2574之间的每一个数字匹配:

SELECT * 
FROM table_name 
WHERE e_id REGEXP("[[:space:]](1(7[5-9]|[89]\d)|[2-9]\d{2}|1\d{3}|2([0-4]\d{2}|5[0-6]\d|57[0-4]))[[:space:]]") 

正则表达式的详细信息:

  • 1(7[5-9]|[89]\d)将匹配175至199
  • [2-9]\d{2}将匹配200至999
  • 1\d{3}将匹配1000〜1999
  • 2([0-4]\d{2}将匹配2000年至2499年
  • 25[0-6]\d将匹配2500年至2699年
  • 257[0-4]将匹配2570至2574年

该解决方案是丑陋的,因为你的数据库是丑陋。
它适用于特定的边界,但正如您所看到的,如果您更改这些边界,则需要重写另一个正则表达式。


你应该有什么:

一个表,你的身份证,另一个与 “e_ids”,然后第三个到两个第一链接:然后

CREATE TABLE `elements` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
); 
CREATE TABLE `other_elements` (
    `e_id` INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`e_id`) 
); 
CREATE TABLE `link_table` (
    `id` INT NOT NULL, 
    `e_id` INT NOT NULL, 
    INDEX `id` (`id`), 
    INDEX `e_id` (`e_id`), 
    CONSTRAINT `FK__elements` 
     FOREIGN KEY (`id`) 
     REFERENCES `elements` (`id`) 
     ON UPDATE CASCADE 
     ON DELETE CASCADE, 
    CONSTRAINT `FK__other_elements` 
     FOREIGN KEY (`e_id`) 
     REFERENCES `other_elements` (`e_id`) 
     ON UPDATE CASCADE 
     ON DELETE CASCADE 
); 

你将能够得到你想要的东西很容易:

SELECT * 
FROM elements e 
JOIN link_table l 
    ON l.id = e.id 
WHERE l.e_id BETWEEN 175 AND 2574 
+0

这帮了我很多。我知道这张桌子是写得很糟糕的概念,但我不是创作者... 非常感谢! –

+0

我们并不总是选择我们工作的数据库......这就是为什么我给出了两个解决方案。如果它解决了您的问题,随时可以upvote /设置此答案为接受。 – zessx