2011-05-22 67 views
1

發現簽入我有一個PostgreSQL下表:SQL查詢從朋友

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

現在,我想檢索有關場地的下列信息

  • 多少女性和男性用戶一個位置都有
  • 類別名稱和圖標
  • 地點名稱
  • 有幾個朋友CHEC ked在一個位置(從給定的用戶ID)

除了最後一點,我解決了它。但我有麻煩來計算來自給定用戶ID的朋友。我試着用這個查詢:

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 

但我得到一個錯誤的女性用戶數。任何想法我做錯了什麼?我想我需要一個友誼表的左連接,因爲如果用戶沒有朋友(或沒有用戶給出),它應該只返回0爲好友數。

希望我自己清楚, THX,禮服

+0

'從地點',我相信它應該是。此外,'WHITE friendships.user_id = 1 OR friendships.user_id = 1'應該可以是'WHITE friendships.user_id = 1 OR friendships.friend_id = 1'。我有一個問題:如果兩個用戶是彼此的朋友,那麼在'友誼'中會有多少記錄,1或2?並且2條記錄應該產生1或2個友誼? – 2011-05-22 10:28:37

+0

thx爲您的答案(我固定它,它是早上toooo;))。當兩個用戶是彼此的朋友時,友誼表中只有一條記錄,請求友誼的用戶存儲在'user_id'中,另一個用於'friend_id' – 23tux 2011-05-22 10:31:01

回答

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

真棒,解決了! ;) – 23tux 2011-05-23 09:15:54

1

distinct在第一線。對於同一字段,您已經有一個group by子句。讓我知道這是否有幫助。