2010-09-10 5 views
1

Je voudrais faire une requête où je peux récupérer un intervalle de 10 lignes avec 5 balises par chacune.MySQL: Limite une requête à 10 lignes où chaque index a 5 balises

J'ai houses et tags table, je sais comment le faire que pour des requêtes simples avec un SELECT en utilisant LIMIT mais comment puis-je faire dans ce cas?

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 

Si une marque une requête comme celui-ci pour obtenir les 10 premières maisons:

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

je reçois quelque chose comme ceci:

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 

Mon problème est que je ne reçois que les 10 premiers lignes découpant le dernier houses de la requête parce que les tags des premiers occupent toutes les rangées

Puis-je écrire une requête où je peux récupérer les 10 premières maisons et 5 étiquettes par personne?

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 

A la fin je besoin d'un résultat que j'affichage comme dans cet exemple:

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 

puis-je faire?

Répondre

1

MySQL ne dispose pas de fonctions d'analyse, ce qui est ce que vous utiliseriez pour cela avant LIMIT:

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

Merci pour l'aide, pouvez-vous m'aider à comprendre la syntaxe CASE et @vars avec un lien d'explication, ce serait très utile pour moi. – vitto

+0

@Vittorio Vittori: La documentation MySQL [CASE] (http://dev.mysql.com/doc/refman/5.0/fr/case-statement.html); @variable_name est une variable. J'utilise le produit cartésien - 'JOIN (SELECT @rownum: = 0, @id: = -1, @house_count: = 0) r' - pour définir les variables sans avoir besoin d'une instruction' SET' séparée. –

+0

désolé pour le retard – vitto

1

Je pense que vous voulez que votre subselect pour vous donner le dos du 10 houseID que vous voulez des résultats pour, puis juste jointure gauche sur la table des balises subselect (limite de 5)

+0

+1 pour l'approche. –

+0

Merci pour votre suggestion, mais il ne semble pas changer le résultat, mon problème commence parce que je voudrais obtenir un intervalle de 10 maisons, y compris 5 étiquettes par chacun, par exemple si j'utilise LIMIT 0, 10 à la Fin de la requête, je pensais que MySql me renvoyait le résultat sans compter les lignes de sous-sélection, mais il semble le faire. Je ne sais pas Si j'ai été clair (j'espère!) – vitto