2015-01-28 2 views
0

enter image description here 항목에 taggables 테이블을 통해 많은 태그가 있습니다. MYSQL에서 "Square"라고 태그도 지정되지 않은 "Blue"태그가 붙은 항목을 검색하려면 어떻게해야합니까?아이가있는 부모를 찾으려면 어떻게해야합니까?

+0

http://forums.mysql.com/read.php?10,507748,507839이 고대 예를 살펴보십시오. 더 이상의 질문이 있으시면 다시 오십시오. (적절한 DDL이 바람직 함) – Strawberry

답변

0

당신은 EXISTSNOT EXISTS으로이 작업을 수행 할 수 있습니다

SELECT items.* FROM items 
WHERE EXISTS(
    SELECT * FROM item_has_tags 
     WHERE item_id=items.id AND name='square') 
AND NOT EXISTS(
    SELECT * FROM item_has_tags 
     WHERE item_id=items.id AND name='blue'); 

단순화하기 위해 일을 보기를 만들 수 있습니다.

CREATE VIEW item_has_tags AS 
    SELECT * FROM taggables 
      JOIN tags ON (taggables.tag_id = tags.id); 

그러면 쿼리는 다음과 같이됩니다.

SELECT items.* FROM items WHERE 
    EXISTS(SELECT * FROM item_has_tags WHERE item_id=items.id AND name='square') 
AND NOT 
    EXISTS (SELECT * FROM item_has_tags WHERE item_id=items.id AND name='blue'); 
0

당신은 레코드의 ID를 커밋 할 반환하는 하위 쿼리 사용하여이 문제를 해결 할 수 있습니다

select i.* 
from items as i 
left join (
    select distinct tg.item_id 
    from taggables as tg 
    inner join tags as t on tg.tag_id = t.id 
    where t.name = 'square' 
    ) as a on I.id = a.item_Id 
where a.item_id is null and i.name = 'blue'; 
+0

@Iserni 실로! 오타를 유감스럽게 생각합니다. 방금 수정했습니다. – Barranka

관련 문제