2011-01-20 2 views
0

나는 각 행은 여러 개의 태그가있는 테이블을 쿼리 : MySQL의 쿼리 - 필터링 기록없이 조인 된 테이블에서 검색

SELECT 
    user.*, 
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag 
ON 
    user_tag.user_id = user.id 
LEFT JOIN 
    tag 
ON 
    tag.id = user_tag.tag_id 
GROUP BY 
    user.id 

가 지금은 태그로 사용자를 검색 할 수 있어야합니다. 는 그래서 어디를 추가 한 후, 그것은 다음과 같습니다

SELECT 
    user.*, 
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag 
ON 
    user_tag.user_id = user.id 
LEFT JOIN 
    tag 
ON 
    tag.id = user_tag.tag_id 
WHERE 
    tag.tag LIKE "%engineer%" OR 
    tag.tag LIKE "%programmer%" 
GROUP BY 
    user.id 

이 그러나 수단 (명백하게) 결과가 발견되면, 태그 테이블이 더 이상 사용자의 모든 태그를 반환하지 않습니다 것을. 따라서 선택한 열 tags은 사용자가 더 많은 태그를 가지고 있더라도 "PHP 프로그래머"처럼 보일 수 있습니다.

서브 쿼리를 사용하지 않고 실제로 반환 된 결과를 제한하지 않고 조인 된 테이블을 검색 할 수있는 방법이 있습니까? 당신은 다른를 추가 할 수 있습니다

+0

"% engineer %"또는 "% programmer %"와 같은 태그가있는 모든 사용자에 대해 조인 된 레코드가 필요합니다. 물론 EXISTS 절은 하위 쿼리로 간주되므로 아마도 원하는 답변이 아닐 수 있습니다. 그렇다면 어떻게 쿼리를 구성 할 수 있는지 보여줄 수 있습니다. – hardmath

답변

0

이 같은 태그 가입 :

SELECT 
    user.*, 
    GROUP_CONCAT(user_tags_to_return.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag user_tags_to_filter 
ON 
    user_tags_to_filter.user_id = user.id 
LEFT JOIN 
    tag tags_to_filter 
ON 
    tags_to_filter.id = user_tags_to_filter.tag_id 
WHERE 
    tags_to_filter.tag LIKE "%engineer%" OR 
    tags_to_filter.tag LIKE "%programmer%" 
LEFT JOIN user_tag user_tags_to_return 
ON user_tags_to_return.user_id = user.id 
LEFT JOIN tag tags_to_return 
ON tags_to_return.id = user_tags_to_return.tag_id 
GROUP BY 
    user.id 
+0

나 바보. 이미 태그 테이블에 다시 가입하려고했지만 user_tag 테이블에 다시 가입해야합니다. – sander

1

여기 내 생각 엔 당신이 너무 좋아, 당신은 "태그"로 HAVING 절을 사용할 수있는 하위 쿼리를 방지하려면 :

SELECT 
    user.*, 
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags` 
FROM 
    user 
LEFT JOIN 
    user_tag 
ON 
    user_tag.user_id = user.id 
LEFT JOIN 
    tag 
ON 
    tag.id = user_tag.tag_id 
GROUP BY 
    user.id 
HAVING 
    tags LIKE "%engineer%" OR tags LIKE "%programmer%" 
+0

좋은 생각입니다. 조건문은'% LIKE %'를 사용하기 때문에이 경우에는 잘 동작 할 것입니다. 그래서 우리가 하나의 태그 또는 그것들 모두의 연결을 비교할지라도 상관 없습니다. –