2014-07-25 5 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:]]로 분리되는 것을 찾아야합니다.

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

...이 하나,하지만 운이 같은 조합의 많은 ...

감사 도움말에 대한 :) :

I는 다음과 같이 MySQL의 쿼리를 사용하려고했다!

답변

0

단일 데이터베이스 열에는 이런 종류의 "목록"이 없어야합니다. 이 경우 한 번에 하나의 e_id을 연결할 다른 테이블이 있어야합니다. 경계가 동적하지 않은 경우

어쨌든,이 문제 에 대한 해결책은 다음과 같습니다

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:]]") 

정규식 세부 사항 :

  • 175과 2574 사이의 모든 수와 일치하는 정규 표현식을 만들 1(7[5-9]|[89]\d)은 175 ~ 199와 일치합니다.
  • 은 200에서 999와 일치합니다.
  • 1\d{3}는 2574

데이터베이스가 추한 때문에이 솔루션은, 추한에 2570과 일치합니다 2699

  • 257[0-4] 2500 일치합니다 2499
  • 25[0-6]\d 2000 일치합니다 1999
  • 2([0-4]\d{2} 1000 일치합니다 .
    이것은 특정 경계에서 작동하지만, 경계를 변경하면 다른 정규 표현식을 다시 작성해야합니다.


    , 당신은해야합니까 :

    당신의 ID가

    테이블, "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/set하십시오. – zessx