2014-01-21 3 views
4

태그가있는 테이블이 있습니다. 여기에는 id, tagTypeId 및 tagName 열이 있습니다. 각 항목에는 많은 태그가있을 수 있습니다. 각 항목에 대해 tagTypeId 1, 2 및 3으로 첫 번째 태그를 선택하고 싶습니다. 제 쿼리 내에서 거의 동일한 3 개의 왼쪽 조인을 추가하려고 시도했지만 매우 좋았습니다 (테이블에서 적은 양의 데이터로 5 초)MySQL 선택 태그

select i.*, tag1.name, tag2.name, tag3.name from items i 
left join (select t.id, t.tagName as name from tags t where t.tagTypeId=1) tag1 on ... 
left join (select t.id, t.tagName as name from tags t where t.tagTypeId=2) tag2 on ... 
left join (select t.id, t.tagName as name from tags t where t.tagTypeId=3) tag3 on ... 

같은 것을 어떻게 하나 가입에 더 잘 달성 할 수있다?

+0

을 의미합니까? 뭐라구? – carexcer

답변

0

당신은

select i.*, tag.name, tagTypeId 
    from items i left join (select t.id, t.tagName as name 
          from tags t where t.tagTypeId in (1, 2, 3)) on ... 
order by i.itemid, tagTypeId 

뭔가를 할 경우 프로그램에서 쉽게 전치 될 수 항목 당 몇 행을 얻을 것입니다.

0
SELECT * FROM 
(SELECT id id1, tagTypeId tag1 FROM items WHERE tagTypeId = 1 LIMIT 1) X1, 
(SELECT id id2, tagTypeId tag2 FROM items WHERE tagTypeId = 2 LIMIT 1) X2, 
(SELECT id id3, tagTypeId tag3 FROM items WHERE tagTypeId = 3 LIMIT 1) X3 

이렇게하면 원하는 것을 얻을 수 있지만 다른 열에 표시됩니다.

+0

사실 내게 그렇게 중요하지는 않지만, 가장 작은 ID를 가진 태그가 될 수 있습니다. – vebbo

+0

좋아, 편집 중입니다. – carexcer

0

또 다른 문제는 다음과 같습니다. 태그를 1..3에서 '피벗 (pivot)'하고 null을 제외하려면 Max()을 그룹화해야합니다. 당신은 '최초의 태그를 선택'무엇을

select i.ItemId, i.ItemName, 
    MAX(CASE WHEN(t.tagTypeID = 1) THEN t.TagName ELSE NULL END) AS Tag1Name, 
    MAX(CASE WHEN(t.tagTypeID = 2) THEN t.TagName ELSE NULL END) AS Tag2Name, 
    MAX(CASE WHEN(t.tagTypeID = 3) THEN t.TagName ELSE NULL END) AS Tag3Name 
from items i 
    INNER JOIN tags t 
    on t.ItemID = i.ItemID 
where t.tagTypeId IN (1,2,3) 
GROUP BY i.ItemID, i.ItemName 

SqlFiddle here