2012-01-19 2 views
1

두 테이블이 있습니다.두 테이블에서 mysql 역 텍스트 검색

먼저 사용 된 단어 목록을 포함하고, 두 번째는 항상 표시 할 수없는 단어의 검은 목록을 유지합니다.

첫 번째 테이블 (A) 예를

+---------------+ 
| keyword  | 
+---------------+ 
| php   | 
| php developer | 
| developer  | 
| c#   | 
+---------------+ 

두 번째 테이블 (B) 예 : 나는 완전히 또는 부분적으로 두 번째 테이블에서 단어를 포함하는 행을 제외한 1 테이블에서 모든 것을 보여 주어야

+-----------+ 
| word  | 
+-----------+ 
| developer | 
| foo  | 
| music  | 
+-----------+ 

. 위의 내용을 기반으로 예를 들어, 나는 두 행만 표시해야합니다 php와 C#. (이 하나가 될 것입니다 경우 아주 좋은) 내가 도움 SQL과 같은 결과에 도달 할 수있는 방법

나는 단지이

select * from A where keyword not in(select word from B); 

을 할 수 있지만 엄격한을 비교 한입니다. 그것은 나에게 충분하지 않다.

어떤 조언을 환영합니다. 감사합니다. .

select keyword from A where keyword not in 
    (select A.keyword from A 
    inner join B on A.keyword like '%' + B.keyword + '%') 

당신은 모든 단어를 선택 B의 단어를 포함하고 다른 단어를 선택 afterwords 그 A :

답변

3

이 같은 것입니다.

+0

대신 % + 키워드 + %가 사용될 수 CONCAT() 함수 를 보인다 예들이 잘 작동하는 의견에 감사드립니다 – user1016265

+0

네, 그것은 또한이 솔루션은 최적이 아닌 느린 것 방법 : –

+0

주를 작동 큰 데이터 세트를 사용해야합니다. 일치하지 않는 테이블로 테이블 A를 제한하는 것보다 테이블 A를 두 번 쿼리합니다. 'A'테이블을 두 번 쿼리하지 않는 솔루션에 대한 내 대답을 참조하십시오. – Seph

4

당신이 원하는 : 사용할 수 없습니다에 용어의 시작에 %와 같은 쿼리의이 종류의 일을하는 B.word에 인덱스를 유발한다는

SELECT keyword FROM A 
WHERE NOT EXISTS (
    SELECT TOP 1 1 FROM B 
    WHERE A.keyword LIKE '%' + B.word + '%') 

참고.

DECLARE @A TABLE 
(
keyword varchar(50) 
) 

DECLARE @B TABLE 
(
word varchar(50) 
) 

INSERT INTO @A VALUES ('php'), ('php developer'), ('Developer'), ('C#') 
INSERT INTO @B VALUES ('developer'), ('fcuk'), ('music') 

SELECT keyword FROM @A A WHERE NOT EXISTS (SELECT TOP 1 1 FROM @B B WHERE a.keyword LIKE '%' + B.word + '%') 

결과 :

keyword 
php 
C# 

편집 : 조금 더 설명 :

내 테스트 코드는

(SQL Server를 사용하는 테이블이 테스트를 위해 선언 그래서는 TSQL하지만 여전히 관련이있는)

이 쿼리는 쿼리의 논리적 확장입니다.

select * from A 
where keyword not in(
    select word from B); 
(논리적으로 동일한이다)는 다음과 같이 쓸 수있다

: 우리가 원하는 것은하는 것입니다

SELECT * FROM A 
WHERE NOT EXISTS (
    SELECT * FROM B 
    WHERE A.keyword = B.word) 

어디에 A.keyword containsB.Word 값 레코드를 제외합니다.이것은에 의해 이루어집니다 미리 대기하고 '%' 문자를 추가하고 =

따라서 쿼리가되는 LIKE보다는 수행 :

SELECT * FROM A 
WHERE NOT EXISTS (
    SELECT * FROM B 
    WHERE A.keyword LIKE = '%' + B.word + '%') 

SELECT 1 1 그냥 무의미과 동일하게 SELECT *을 할 수있다 오히려 경우에, 모두 EXISTS 문 안의 똑같은 것을 말하며 StackOverflow에 대한 답변이 많습니다. 왜 그들이 같은지 설명하는 데 전념합니다. MySQL을위한

+0

+1 키워드를 대/소문자로 입력 할 수 있는지 여부와 OP 데이터베이스에서 대소 문자를 구분할 수 있는지 여부에 따라 합치면 a.keyword와 B.word를 소문자로 명시 적으로 변환하는 것이 유용 할 수 있습니다. –

+0

답변을 주셔서 감사합니다 – user1016265

+0

예, 위의 제안과 같이 하나의 테이블에 대한 쿼리의 양은 옳지 만 쿼리를 더 자세히 설명 할 수 있습니까? – user1016265

관련 문제