2013-05-06 2 views
1

다른 두 테이블의 ID를 연결하는 테이블을 가지고있을 때 여러 명령문을 쿼리 할 수 ​​있기를 원합니다.MySQL에서 여러 조건에 대한 쿼리

내 세 개의 테이블 마지막 키워드로 목적지를 연결하기 위해, destination- 및 키워드 테이블에서 ID를 연결

destination: 
id_destination, name_destination 

keyword: 
id_keyword, name_keyword 

destination_keyword: 
id_keyword, id_destination 

.

다음

SELECT destination.name_destination FROM destination 
      NATURAL JOIN destination_keyword 
      NATURAL JOIN keyword 
      WHERE keyword.name_keyword like _keyword_ 

과 같을 것이다 키워드를 기반으로 대상을 얻을 수있는 쿼리의 내가있는 키워드의 전부 또는 일부 일치하는 목적지를 얻고 싶었다 가정 해 봅시다, 복수 키워드를 조회 할 수 있나요 sunny, ocean, fishing 목록과 일치하는 항목 수. 나는 어떻게 앞으로 나아갈 것인가? 테이블을 재구성해야합니까? 나는 SQL에 익숙하지 않으며 약간의 입력을 매우 좋아할 것이다.

SELECT dest.name_destination, count(*) FROM destination dest, destination_keyword dest_key, keyword key 
WHERE key.id_keyword = dest_key.id_keyword 
AND dest_key.id_destination = dest.id_destination 
AND key.name_keyword IN ('sunny', 'ocean', 'fishing') 
GROUP BY dest.name_destination 
ORDER BY count(*), dest.name_destination 

그것을 테스트하지 않은,하지만이 수정되지 않은 경우 그것은 당신에게 그것을 달성하는 방법을 표시해야합니다 :

+0

'name_keyword' 값이 "sunny"같은 단일 단어입니까? – Bohemian

+0

그들은 한 마디입니다. – Martol1ni

답변

1

주문 테이블이 keyword로 시작하고 대상이 가입되어 시간의 수에 수를 사용하는 조인은 :

select 
    d.id_destination, 
    d.name_destination, 
    count(d.id_destination) as matches 
from keyword k 
join destination_keyword dk on dk.keyword = k.keyword 
join destination d on d.id_destination = dk.id_destination 
where name_keyword in ('sunny', 'ocean', 'fishing') 
group by 1, 2 
order by 3 desc 

이 쿼리는 name_keyword 값은 "써니"와 같은 하나의 단어 있다고 가정합니다. 테이블 구조를 변경하는 경우 등 두 개의 자연 조인 된 테이블이 같은 이름이 갑자기 쿼리가 작동이 중지됩니다, 추가 된 열을 가지고 변경된 얻을 수 있기 때문에


자연을 사용하여 조인은 좋은 생각이 아니다. 또한 명시 적으로 조인 조건을 선언하면 코드 판독기가 테이블이 jones 인 f}을 즉시 이해하고 필요에 따라 비 핵심 조건을 추가하도록 수정할 수 있습니다.

단순히 "name"대신 "name_keyword"와 같은 부 자연스러운 열 이름이 필요하므로 키 열만 동일한 이름을 공유하도록 요구합니다. 접미사 "_keyword"는 중복되어 값을 추가하지 않으며 은 자연 결합을 사용하기 때문에이 있습니다.

자연스러운 조인은 타이핑을 거의 저장하지 않고 (종종 을 입력하고 모두을 입력 함) 조인 유형과 이름에 제한을 가하고 부서지기 쉽습니다.

그들은 피해야합니다.

+0

고마워, 그 위대한 작품. 내가 여러 줄을 가져 와서 비교하고 있다고 생각하는 것은 확실하지 않았습니다. 별도의 일치 항목도 표시 할 수 있습니까? 또한 '맑음', '바다'와 같이 일치하는 키워드를 선택하십시오. - 그리고'name_keyword'는 한 단어입니다, 네. – Martol1ni

0

는 다음과 같은 것을 시도 할 수 있습니다.

Column LIKE 'value1' OR Column LIKE 'value2' OR ... 

또는 정규 표현식 매치를 할 수있는 : 여러 LIKE 문을 수행 할 수 있습니다

+0

OP가 LIKE 경기를하고 싶어한다고 생각합니다. 따라서 LIKE가 IN에서 작동하지 않으므로 솔루션이 작동하지 않습니다. – Nabheet

+0

@NabheetSandhu 글쎄, 그는 올바른 것으로 표시된 대답을 확인하는 그는 좋아하지 않아 보인다. – drewich

+0

드류 리치, 당신 말이 맞아요. 사과! – Nabheet

0

Column LIKE 'something|somtthing|whatever' 
일치의 수에 의하여 주문에 대한 트릭은 GROUP BY를 이해하고 함께 할 수있다

절과 ORDER BY 절. 당신은 모든 것에 대해 하나의 카운트를 원하거나, 무언가에 대해 하나의 카운트를 원할 것입니다. 따라서 첫 번째 경우에는 COUNT 함수 만 사용하면됩니다. 두 번째 경우에는 GROUP BY 절을 사용하여 계산하려는 항목/범주를 "그룹화"합니다. ORDER BY는 꽤 솔직해야합니다.

나는 당신이 제공 한 정보를 기반으로 테이블 구조가 훌륭하다고 생각합니다.

희망이 도움이됩니다.

면책 조항 : 내 구문이 정확하지 않습니다.

관련 문제