MySql-在函数之间组合REGEXP和

MySql-在函数之间组合REGEXP和,mysql,regex,between,Mysql,Regex,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

我有这张桌子

+--------+----------------+ | 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 " | +--------+-----------------+ …还有很多像这样的组合,但运气不好


谢谢你的帮助!:)

您不应该在单个数据库列中包含此类“列表”。在这种情况下,您应该有另一个表一次链接一个
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
此解决方案很难看,因为您的数据库很难看。
它适用于特定的边界,但正如您所看到的,如果更改这些边界,则需要重写另一个正则表达式


你应该拥有的:

一个带有您ID的表,另一个带有“e_ID”,然后是第三个表,用于首先链接这两个:

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

这对我帮助很大。我知道这个表是用非常糟糕的概念编写的,但我不是创建者…非常感谢!我们并不总是选择我们所处理的数据库…这就是为什么我给出了两种解决方案。如果这个答案解决了您的问题,请随意升级/设置为接受。
SELECT *
FROM elements e
JOIN link_table l
  ON l.id = e.id
WHERE l.e_id BETWEEN 175 AND 2574