2014-07-25 21 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