2011-01-13 1 views
0

이 두 테이블 가정이 개 쉼표로 구분 된 필드 사이를 검색 :

블로그를

id title  keywords 
1 Hello  hello,world,test 
2 Google  search, email, security 
3 Microsoft clippy, collaboration 

카테고리

id keywords 
1 test, world, clippy 

나는 하나 이상이 블로그 행을 검색하려면 어떻게 카테고리 행의 키워드와 일치하는 키워드는 무엇입니까?

+5

언제든지이 데이터 모델을 변경할 수 있습니까? 보다 효율적인 검색을 위해 더 나은 저장 방법이 있습니다. – Paddy

+0

내 머리 꼭대기에서 나는 잘 모르겠다. 그러나 나는 susbtring 기능이 아마도 당신에게 매우 유용 할 것이라고 생각한다. 여기에 더 많은 문자열 함수가 있습니다. http://dev.mysql.com/doc/refman/5.0/en/string-functions.html 장기적인 해결책은 키워드를 별도의 테이블로 리팩터링 한 다음 blogs_keywords 테이블을 사용하여 블로그 ID와 키워드 ID의 쌍. – FrustratedWithFormsDesigner

+0

알아,하지만 변경할 수는 없어. 내가 현재 할 수없는 많은 엉망이 정리 될 필요가 있습니다. – HyderA

답변

1

간결하게 : 해당 작업을 수행하려면 해당 데이터를 저장하지 마십시오. 당신은 당신의 데이터를 정상화하고, 정규화 된 데이터를 사용하여 검색 :

CREATE TABLE Blog 
(
    id  INTEGER NOT NULL PRIMARY KEY, 
    title VARCHAR(30) NOT NULL 
); 

INSERT INTO Blog(id, title) VALUES(1, 'Hello'); 
INSERT INTO Blog(id, title) VALUES(2, 'Google'); 
INSERT INTO Blog(id, title) VALUES(3, 'Microsoft'); 

CREATE TABLE BlogKeywords 
(
    id  INTEGER NOT NULL, 
    keyword VARCHAR(20) NOT NULL, 
    PRIMARY KEY(keyword, id) 
); 

INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'hello'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'world'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'test'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'search'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'email'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'security'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'clippy'); 
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'collaboration'); 

CREATE TABLE Category 
(
    id  INTEGER NOT NULL, 
    keyword VARCHAR(20) NOT NULL, 
    PRIMARY KEY(id, keyword) 
); 

INSERT INTO Category(id, keyword) VALUES(1, 'test'); 
INSERT INTO Category(id, keyword) VALUES(1, 'world'); 
INSERT INTO Category(id, keyword) VALUES(1, 'clippy'); 

은 이제 간단한 사용하여 쉽게 검색 할 수 있습니다 조인 :

SELECT DISTINCT b.id AS BlogID, b.Title, c.id AS CategoryID 
    FROM Blog AS b 
    JOIN BlogKeywords AS K ON b.id  = k.id 
    JOIN Category  AS C ON k.keyword = c.keyword; 

당신이 있는지 확인하고자했던 것과 완전히 명확하지 않다가 여러 범주였습니다.

0

간단한 쿼리를 사용하는 좋은 방법은 없습니다. 이런 종류의 데이터 모델이 정말로 필요한 경우, 내가 보는 유일한 방법은 테이블을 가로 지르고 각 행을 직접 일치시키는 것입니다. 저장 프로 시저 또는 클라이언트 코드에서이 작업을 수행 할 수 있습니다. 예, 그것은 끔찍할 것입니다.하지만 쿼리 엔진은 어쨌든 더 훌륭하게 수행 할 수 없습니다. 커서를 사용하고 앱 메모리에서 전체 테이블을로드하지 않도록하십시오.