2017-06-23 1 views
0

J'ai cinq tables: utilisateurs, intérêts, animaux, interests_animals, interests_users.rails ordre de groupe par compte

utilisateur foo

Intérêts 1, 2, 3

animaux 1, 2, 3

foo a des intérêts 1, 2, 3

Intérêts 1 a animale 1, 2 Intérêt 2 a Animal 1, 2, 3 Intérêt 3 a Animal 3

J'ai besoin de retour tout animal s par des intérêts regroupés pour id d'intérêt de foo commandé par les animaux comptent

J'essaie comme ceci:

SELECT animals.* FROM animals 
INNER JOIN interests_animals ON animals.id = interests_animals.animal_id 
INNER JOIN interests ON interests_animals.interest_id = interests.id 
INNER JOIN interests_users ON interests.id = interests_users.interest_id 
WHERE interests_users.user_id = XXX 
GROUP BY animals.id 
ORDER BY COUNT(interests_animals.animal_id); 

J'ai besoin que les animaux sont retournés dans les commandes 2, 1, 3, mais toujours revenir 1,2 3

Répondre

1

Vous devez spécifier explicitement les colonnes sur lesquelles vous effectuez GROUP BY dans la clause SELECT.

Toutes les autres parties de la clause SELECT doivent être des agrégats comme count(), somme(), etc.

avis, que nous utilisons count (distinct ..) ici parce que chaque ID animal peut apparaître plusieurs fois en raison de la chaîne de JOIN:

SELECT 
    interests.id, 
    COUNT(DISTINCT animals.id) as animals_count 
JOIN interests_animals ON animals.id = interests_animals.animal_id 
JOIN interests ON interests_animals.interest_id = interests.id 
JOIN interests_users ON interests.id = interests_users.interest_id 
WHERE interests_users.user_id = XXX 
GROUP BY 1 
ORDER BY 2 desc; 

- dans GROUP BY et ORDER BY, il est généralement facile à utiliser que des chiffres - "1" signifie "la 1ère colonne de la clause SELECT", etc.

En outre, "INNER" est un mot-clé optionnel (simplement "JOIN" et "INNER JOIN" sont la même chose).

En outre, comme une note de côté, vous pourriez trouver utile d'ajouter à votre clause SELECT:

, array_agg(animals.id order by animals.id) as animal_ids 

- cela vous donnera tableau entier de tous les ID animaux qui se rapportent à un intérêt particulier, commandé .

+0

vous êtes l'homme! –