2011-05-22 7 views
1

j'ai les tableaux ci-dessous dans un PostgreSQL:requête SQL pour trouver checkins des amis

Categories | Locations | Checkins  | Users | Friendships 
id   | id   | id   | id  | user_id 
name  | category_id | location_id | gender | friend_id 
icon  | name  | user_id  |  | 

Maintenant, je veux récupérer les informations suivantes sur un lieu

  • Combien d'utilisateurs des femmes et des hommes un emplacement a
  • nom de la catégorie et l'icône
  • nom de l'emplacement
  • Combien d'amis ont chec ked in à un emplacement (à partir d'un identifiant utilisateur donné)

Excepté le dernier point, je l'ai résolu. Mais j'ai des problèmes pour compter les amis d'un identifiant d'utilisateur donné. Je l'ai essayé avec cette requête:

SELECT distinct locations.id, 
max(locations.name) as name, 
max(locations.location) as location, 
max(categories.name) as cat, 
max(categories.icon) as caticon, 
SUM(CASE WHEN users.gender = 'm' THEN 1 ELSE 0 END) AS male, 
SUM(CASE WHEN users.gender = 'f' THEN 1 ELSE 0 END) AS female, 
SUM(CASE WHEN friendships.user_id = 1 OR friendships.friend_id=1 THEN 1 ELSE 0 END) AS friends 
FROM locations 
INNER JOIN checkins ON checkins.location_id = locations.id 
INNER JOIN users ON users.id = checkins.user_id 
INNER JOIN categories ON categories.id = locations.category_id 
LEFT JOIN friendships ON friendships.user_id = users.id OR friendships.friend_id = users.id 
WHERE locations.id=7 
GROUP BY locations.id 

Mais je reçois un mauvais nombre de compte pour les utilisateurs féminins. Une idée de ce que je fais mal? Je pense que j'ai besoin d'une jointure à gauche pour la table des amitiés, parce que si un utilisateur n'a pas d'amis (ou aucun utilisateur n'est donné) il devrait seulement retourner 0 pour le nombre d'amis.

espoir que je me suis fait clair, thx, tux

+0

'D'endroits ', je crois qu'il devrait être. Aussi, 'WHEN friendships.user_id = 1 OU friendships.user_id = 1' devrait probablement être' WHEN friendships.user_id = 1 OU friendships.friend_id = 1'. Et j'ai une question: si deux utilisateurs sont amis l'un de l'autre, combien d'enregistrements y aurait-il dans les 'amitiés ', 1 ou 2? Et 2 enregistrements devraient-ils produire 1 ou 2 amitiés? –

+0

thx pour votre réponse (je l'ai réparé, c'est trop tôt le matin;)). Lorsque deux utilisateurs sont les amis de l'autre, il y a exactement un enregistrement dans la table des amis, l'utilisateur qui a demandé l'amitié est stocké dans 'user_id' et l'autre dans' friend_id' – 23tux

Répondre

2
SELECT 
    L.id, 
    L.name, 
    c.name AS cat, 
    c.icon AS caticon, 
    COUNT(CASE u.gender WHEN 'm' THEN 1 END) AS male, 
    COUNT(CASE u.gender WHEN 'f' THEN 1 END) AS female, 
    COUNT(f.user_id) AS friends 
FROM Locations L 
    INNER JOIN Categories c ON c.id = L.category_id 
    INNER JOIN Checkins ch ON ch.location_id = L.id 
    INNER JOIN Users u ON u.id = ch.user_id 
    LEFT JOIN Friendships f ON f.user_id = @user_id AND f.friend_id = ch.user_id 
          OR f.user_id = ch.user_id AND f.friend_id = @user_id 
WHERE L.id = @location_id 
GROUP BY L.id, L.name, c.name, c.icon 
+0

génial, résolu! ;) – 23tux

1

Drop the distinct dans la première ligne. Vous avez déjà une clause group by pour le même champ. Faites-moi savoir si cela vous a été utile.

Questions connexes