Aller au contenu


Photo

Error : La colonne n'existe pas


  • Veuillez vous connecter pour répondre
1 réponse à ce sujet

#1 Julie SUP !

Julie SUP !

    Newbie

  • Members
  • Pip
  • 7 messages

Posté 21 novembre 2013 - 11:35

Bonjour,

 

Je reviens avec une nouvelle question pour mes problèmes de requêtes !

 

Disons que j'ai 3 tables :

association (id,name)

race (id,name)

association_race_report(id, date, associationId, raceId, quantity)

 

J'essaye de récupérer la liste des associations, avec pour chacune, la liste des races et leur quantité, sur une période donnée. Je les trie dans un premier temps par le nombre total pour l'association, puis le nombre de chaque race. Il n'y a pas de problèmes, je fais ça comme ça :

SELECT association.name AS associationName,
        race.name AS raceName,
        SUM(report.quantity) AS quantity,
        subrequest.totalquantity as totalquantity
    FROM association_race_report report
    JOIN association ON association.id = report.associationId
    JOIN race ON race.id = report.raceId
    JOIN (
        SELECT SUM(report.quantity) AS totalquantity,
            association.id AS subId
        FROM association_race_report report
        JOIN association ON association.id = report.associationId
        WHERE date LIKE "2013-11-%"
        GROUP BY association.id
        ORDER BY totalquantity DESC
    ) subrequest ON subrequest.subId = association.id
    WHERE date LIKE "2013-11-%"
    GROUP BY association.id, race.id
    ORDER BY totalquantity DESC, quantity DESC

Ma nouvelle problématique, c'est de ne récupérer que les 2 premières races pour chacune des associations. J'ai donc essayé quelque chose comme ça :

set @num := 0, @association := '';
select associationName, raceName, quantity, totalquantity,
@num := if(@association = associationName, @num + 1, 1) as row_number,
        @association := associationName as dummy
FROM (
    SELECT association.name AS associationName,
        race.name AS raceName,
        SUM(report.quantity) AS quantity,
        subrequest.totalquantity as totalquantity
    FROM association_race_report report
    JOIN association ON association.id = report.associationId
    JOIN race ON race.id = report.raceId
    JOIN (
        SELECT SUM(report.quantity) AS totalquantity,
            association.id AS subId
        FROM association_race_report report
        JOIN association ON association.id = report.associationId
        WHERE date LIKE "2013-11-%"
        GROUP BY association.id
        ORDER BY totalquantity DESC
    ) subrequest ON subrequest.subId = association.id
    WHERE date LIKE "2013-11-%"
    GROUP BY association.id, race.id
    ORDER BY totalquantity DESC, quantity DESC
) x
WHERE row_number <= 2

Le problème, c'est que cette requête ne fonctionne pas car j'ai une erreur comme quoi row_number n'existe pas. Si j'enlève la clause WHERE à la fin, ça fonctionne très bien : dans mon résultat, j'ai bien une colonne row_number avec le résultat attendu.

 

Si je rajoute une "couche" comme ça :

set @num := 0, @association := '';
select associationName, raceName, quantity, totalquantity
FROM (
    select associationName, raceName, quantity, totalquantity,
    @num := if(@association = associationName, @num + 1, 1) as row_number,
            @association := associationName as dummy
    FROM (
        SELECT association.name AS associationName,
            race.name AS raceName,
            SUM(report.quantity) AS quantity,
            subrequest.totalquantity as totalquantity
        FROM association_race_report report
        JOIN association ON association.id = report.associationId
        JOIN race ON race.id = report.raceId
        JOIN (
            SELECT SUM(report.quantity) AS totalquantity,
                association.id AS subId
            FROM association_race_report report
            JOIN association ON association.id = report.associationId
            WHERE date LIKE "2013-11-%"
            GROUP BY association.id
            ORDER BY totalquantity DESC
        ) subrequest ON subrequest.subId = association.id
        WHERE date LIKE "2013-11-%"
        GROUP BY association.id, race.id
        ORDER BY totalquantity DESC, quantity DESC
    ) x
)y
WHERE row_number <= 2

La ça fonctionne bien et j'obtiens bien le résultat attendu ! Donc ma question, c'est pourquoi MySQL m'oblige à rajouter une sous requête comme ça alors que la colonne row_number existe déjà bel et bien ? Après c'est peut-être particulier avec les variables avec @ (j'avoue ne pas très bien connaitre) ou alors parce qu'on fait le FROM depuis une table "temporaire" (je suis pas sure que ce soit le bon mot) ?

Y-a-il donc un moyen d'éviter de passer par cette sous requête supplémentaire ? Pourquoi MySQL ne veut pas fonctionner avec ma première requête ?

 

Merci !!


 



#2 Julie SUP !

Julie SUP !

    Newbie

  • Members
  • Pip
  • 7 messages

Posté 21 novembre 2013 - 03:59

Je me répond toute seule : 

Il faut remplacer :

WHERE row_number <= 2

Par : 

WHERE if(@association = associationName, @num + 1, 1) <= 2






0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)