2014-01-21 4 views
4

У меня есть таблица с тегами. Он имеет идентификаторы столбцов, 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 и 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

Смежные вопросы