2010-09-10 1 views
1

Я хотел бы сделать запрос, где я могу получить интервал 10 строк с 5 тегами на каждый.MySQL: Ограничьте запрос до 10 строк, где каждый индекс имеет 5 тегов

Я houses и tags стол, я знаю, как сделать это только для простых запросов с использованием SELECTLIMIT, но как я могу это сделать в этом случае?

table houses 
id house   country 
1  Grunt Mansion us 
2  Hororo Suneku jp 
3  Casa Cattani  it 
4  Sweet Home  uk 
5  Heinzvaiter  de 
6  F56X-5   us 
7  Swan Jong  cn 
8  Drupnowevo  ru 
9  Bambagiador  br 
10 El Stanco  es 

table houses_tags 
id id_house id_tag 
1  1   1 
2  1   2 
3  1   3 
4  1   4 
5  2   1 
6  2   2 
7  2   3 
8  2   4 

table tags 
id tag 
1  minimal 
2  baroque 
3  cosy 
4  simple 

Если сделать запрос, как это, чтобы получить первые 10 домов:

SELECT * 
FROM houses 
LEFT JOIN (
    SELECT * 
    FROM tags 
    INNER JOIN houses_tags 
    ON id_house = houses.id 
    LIMIT 5 
) house_tag 
LIMIT 0, 10 

я получаю что-то вроде этого:

query result 
row house   country tag  id_house  id_tag 
1  Grunt Mansion us   minimal 1   1 
2  Grunt Mansion us   baroque 1   2 
3  Grunt Mansion us   cosy  1   3 
4  Grunt Mansion us   simple 1   4 
5  Hororo Suneku jp   minimal 2   1 
6  Hororo Suneku jp   baroque 2   2 
7  Hororo Suneku jp   cosy  2   3 
8  Hororo Suneku jp   simple 2   4 
9  Casa Cattani  it   NULL  NULL   NULL 
10  Sweet Home  uk   NULL  NULL   NULL 

Моя проблема в том, я получаю только первые 10 ряды вырезают последние houses из запроса, потому что tags первых занимают все строки

Могу ли я написать запрос, где я могу получить первые 10 домов и 5 тегов на каждый?

query result 
row house   country tag  id_house  id_tag 
1  Grunt Mansion us   minimal 1   1 
2  Grunt Mansion us   baroque 1   2 
3  Grunt Mansion us   cosy  1   3 
4  Grunt Mansion us   simple 1   4 
5  Hororo Suneku jp   minimal 2   1 
6  Hororo Suneku jp   baroque 2   2 
7  Hororo Suneku jp   cosy  2   3 
8  Hororo Suneku jp   simple 2   4 
9  Casa Cattani  it   NULL  NULL   NULL 
10  Sweet Home  uk   NULL  NULL   NULL 
11  Heinzvaiter  de   NULL  NULL   NULL 
12  F56X-5   us   NULL  NULL   NULL 
13  Swan Jong  cn   NULL  NULL   NULL 
14  Drupnowevo  ru   NULL  NULL   NULL 
15  Bambagiador  br   NULL  NULL   NULL 
16  El Stanco  es   NULL  NULL   NULL 

В конце концов, я должен нужен мне результат отображения как в этом примере:

Mansions   Tags 
Grunt Mansion  minimal, baroque, cosy, simple 
Hororo Suneku  minimal, baroque, cosy, simple 
Casa Cattani  - 
Sweet Home  - 
Heinzvaiter  - 
F56X-5   - 
Swan Jong   - 
Drupnowevo  - 
Bambagiador  - 
El Stanco   - 

pages 1 | 2 | 3 

я могу сделать это?

ответ

1

MySQL не имеет аналитические функции, что и вы должны использовать для этого до ПРЕДЕЛЫ:

SELECT x.id, 
      x.house, 
      x.country, 
      x.id_tag 
     FROM (SELECT h.id, 
        h.house, 
        h.country, 
        ht.id_tag, 
        CASE 
        WHEN @id = h.id THEN @rownum := @rownum + 1 
        ELSE @rownum := 1 
        END AS rank, 
        @id := h.id, 
        @house_count := @house_count + 1 AS house_count 
       FROM HOUSE h 
     LEFT JOIN HOUSES_TAGS ht ON ht.id_house = h.id 
       JOIN (SELECT @rownum := 0, @id := -1, @house_count := 0) r 
      ORDER BY h.id, ht.id_tag) x 
    WHERE x.house_count <= 10 
    AND x.rank <= 4   
ORDER BY x.id, x.id_tag 
+0

Спасибо за помощь, можете ли вы также помочь мне понять синтаксис CASE и @vars с некоторой ссылкой на объяснение, это было бы очень полезно для меня. – vitto

+0

@ Vittorio Vittori: MySQL [документация CASE] (http://dev.mysql.com/doc/refman/5.0/en/case-statement.html); @variable_name - это переменная. Я использую декартово произведение - 'JOIN (SELECT @rownum: = 0, @id: = -1, @house_count: = 0) r' - для определения переменных без необходимости отдельной инструкции' SET'. –

+0

извините за задержку – vitto

1

Я думаю, что вы хотите, чтобы ваш подзапрос, чтобы дать вам обратно 10 houseID, которого вы хотите результаты для, то просто оставил присоединиться к таблице тегов подвыборки (предел 5)

+0

+1 для подхода. –

+0

Спасибо за ваше предложение, но это, похоже, не меняет результат, моя проблема начинает оставаться на связи. Я бы хотел получить интервал из 10 домов, включая 5 тегов на каждый, например, если я использую LIMIT 0, 10 на конец запроса, я думал, что MySql вернул мне результат без подсчета строк подзаголовка, но, похоже, это делает. Я не знаю, если бы я был ясен (надеюсь!) – vitto