0

Je sais qu'il y a beaucoup d'autres entrées SO qui ressemblent à celle-ci, mais je n'en ai pas trouvé une qui répond réellement à ma question, alors j'espère que l'une d'entre vous soit répondez-y ou indiquez-moi une autre question de SO qui est liée.Tri des lignes par nombre d'enregistrements associés plusieurs-à-plusieurs

Fondamentalement, j'ai la requête suivante qui renvoie Venue s qui ont CheckIn s qui contiennent le Keyword recherché ("foobar" dans cet exemple).

SELECT DISTINCT v.* 
FROM "venues" v 
    INNER JOIN "check_ins" c ON c."venue_id"  = v."id" 
    INNER JOIN "keywordings" ks ON ks."check_in_id" = c."id" 
    INNER JOIN "keywords" k ON ks."keyword_id" = k."id" 
WHERE (k."name" = 'foobar') 

Je veux SELECT et ORDER BY le compte du apparié Keyword pour chaque donnée Venue. Par exemple. s'il y a eu 5 CheckIn s qui ont été créés, associés à Keyword, alors il devrait y avoir une colonne retournée (appelée quelque chose comme keyword_count) avec la valeur 5 qui est triée.

Idéalement, cela devrait être fait sans aucune requête dans la clause SELECT, ou de préférence pas du tout.

Je me bats avec cela depuis un moment et mon esprit est en train de devenir vide (peut-être que ça a été trop long un jour) donc de l'aide serait grandement appréciée ici.

Merci d'avance!

Répondre

1

On dirait que vous avez besoin quelque chose comme:

SELECT v.x, v.y, count(*) AS keyword_count 
FROM "venues" v 
    INNER JOIN "check_ins" c ON c."venue_id"  = v."id" 
    INNER JOIN "keywordings" ks ON ks."check_in_id" = c."id" 
    INNER JOIN "keywords" k ON ks."keyword_id" = k."id" 
WHERE (k."name" = 'foobar') 
GROUP BY v.x, v.y 
ORDER BY 3 
+0

homme Oh, j'étais si proche. Je suppose que j'étais trop fatigué la nuit dernière. Vous, monsieur, êtes un héros! –

Questions connexes