2012-10-10 4 views
1

데이터베이스 필드에 쉼표로 구분 된 데이터가 저장되어 있습니다. 같은 필드에 colors처럼 다음과 같은 행이 있습니다.쉼표로 구분 된 데이터베이스 필드를 쉼표로 구분 된 사용자 입력으로 검색 중

red,blue, green 
blue, white, purple, pink 
yellow, khaki, maroon, orange 
gray, lemon, black, brown 

다음 사용자는 HTML 양식의 텍스트 상자를 사용하여 쉼표로 구분 된 양식으로 색상을 입력합니다. 나는 그의 입력과 일치하는 레코드를 반환하도록 데이터베이스를 검색하려고한다. 예를 들어.

red, purple, orange을 입력하면 첫 번째 행이 빨간색이고 두 번째 행이 보라색이고 세 번째 행이 오렌지이므로 쿼리는 세 행을 반환해야합니다.

사용자 입력을 배열로 분해하고 각 색상을 반복하고 결과를 얻기 위해 데이터베이스를 검색하는 것보다 쉬운 방법이 아닙니다. 이 작업을 수행하는 더 쉬운 방법이 있습니까?

편집

나는 쉼표로 분리 된 형태로 데이터를 저장하는 것은 좋은 방법이 아닙니다하지만 난 다른 프로그래머에 의해 만들어진 응용 프로그램에 대한 업데이트 작업을 해요 알고있다. 그리고이 단계에서 저는 테이블 구조를 변경할 여력이 없습니다.

감사합니다.

+3

데이터 구조를 표준화하지 않았기 때문에 쉽게 찾을 수없는 이유입니다. 네가 가진다면 지금 당장 데이지를 뛰어 넘을거야. – podiluska

+1

http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad –

+0

@podiluska 제발 내 편집을 참조하십시오. – WatsMyName

답변

1
  1. 는 가장 좋은 방법입니다 귀하의 응용 프로그램)은 FIND_IN_SET() 함수를 사용합니다 :

    SELECT * 
    FROM my_table 
    WHERE FIND_IN_SET('red', colors) 
        OR FIND_IN_SET('purple', colors) 
        OR FIND_IN_SET('orange', colors) 
    
+0

두 번째 옵션으로 이동하겠다고 생각합니다. 이를 위해 사용자 입력을 배열로 쪼개고 루프를 거쳐서 마치 FIND_IN_SET 쿼리를 만들어야합니다. 고마워 친구 – WatsMyName

1

불행히도, 더 간단한 방법은 없습니다.

그러나 더 좋은 방법은 normalize the DB structure이며 색을 별도의 테이블에 유지하고 주 피사체와 색상 표 사이에 피벗 테이블을 만듭니다.

그런 다음 사용자가 입력 한 값을 분할하고 색상의 ID를 가져 와서 피벗 테이블에서 검색해야합니다.

이 주요 이점은 검색 할 때 DB 인덱스를 사용하는 것입니다.

SELECT * 
FROM my_table 
WHERE id IN (
       SELECT item_id 
       FROM itemColors 
       WHERE color IN ('red','purple','orange') 
      ) 
  • 그렇지 않으면 쿼리를 만들 수있다 (에 : 그런 다음 하나에 불과 할 필요

    CREATE TABLE colors (color VARCHAR(6) NOT NULL PRIMARY KEY); 
    
    INSERT INTO colors VALUES 
        ('red'), ('blue'), ('green'), ('white'), ('purple'), ('pink'), 
        ('yellow'), ('khaki'), ('maroon'), ('orange'), ('gray'), 
        ('lemon'), ('black'), ('brown'); 
    
    CREATE TABLE itemColors (
        item_id BIGINT UNSIGNED NOT NULL, 
        color VARCHAR(6)  NOT NULL, 
        FOREIGN KEY (item_id) REFERENCES my_table (id), 
        FOREIGN KEY (color) REFERENCES colors (color) 
    ); 
    
    INSERT INTO itemColors (item_id, color) 
        SELECT my_table.id, colors.color 
        FROM my_table JOIN colors ON FIND_IN_SET(colors.color, my_table.colors); 
    
    ALTER TABLE my_table DROP COLUMN colors; 
    

    :이 옵션의 경우 코스 정상화의