2012-06-11 65 views
0

我有以下查詢選擇一個朋友請求腳本,顯示用戶的個人資料圖片,家鄉,用戶標識和已經請求成爲某個用戶的朋友的全名。SQL選擇用戶

SELECT 
    a.hometown, 
    a.first_name, 
    a.uid, 
    a.last_name, 
    b.friend_one, 
    b.friend_two, 
    b.friend_request_id, 
    p.thumbnail 
FROM 
    users a, 
    friend_requester b, 
    profile_pics p 
WHERE 
    a.uid = b.friend_one 
AND b.friend_two = $uid 
AND p.uid_fk = $uid 
ORDER BY b.created DESC LIMIT 5 

我的問題是,而不是返回1個用戶針對friend_requester表中找到每個查詢,我回到3個實例,例如不同的個人資料照片相同的用戶。因此,如果用戶上傳了3倍個人的照片將被保存爲

id=1, profile_pic=profile_pic1.jpg... 

id=1 profile_pic=profile_pic2.jpg... 

id=1 profile_pic=profile_pic3.jpg... 

我得到3個不同的同一用戶的箱子問是朋友與登錄用戶。

隨着Hituptony提到,我想選擇最新插入的圖片,它將來自「創建」列中的'profile_pics'表格。

+0

你需要確保加盟'p'到無論是'a'還是'b'。否則,這是一個交叉連接,它將匹配上一個表中的每一行。 –

+0

gms - 否如果$ uid是一個鍵,則不需要加入它們,您已通過匹配相同的靜態值來保證唯一性。問題是優化器是否會知道這一點。 –

回答

1

GROUP BY Uid_FK,獲得最大創建和INNER JOIN回圖像表

SELECT a.hometown, 
     a.first_name, 
     a.uid, 
     a.last_name, 
     b.friend_one, 
     b.friend_two, 
     b.friend_request_id, 
     p.thumbnail 
FROM users a 
     INNER JOIN friend_requester b 
      ON b.friend_one = a.uid 
     INNER JOIN profile_pics p 
      ON p.uid_fk = b.frind_two 
     INNER JOIN 
     ( SELECT uid_FK, MAX(Created) AS Created 
      FROM Profile_Pics 
      GROUP BY uid_FK 
     ) MaxPic 
      ON MaxPic.UID_FK = p.UID_FK 
      AND MaxPic.Created = p.Created 
WHERE p.uid_fk = $uid 
+0

嗨Gareth我使用$ uid作爲登錄用戶的session_id,因此您的代碼工作得很好,但它錯誤地返回了與登錄用戶的縮略圖相匹配的縮略圖,而不是朋友請求者。我將如何解決這個問題? – user1011713

+0

我想你需要將WHERE子句改成WHERE a.uid = $ uid' – GarethD

0

那麼你想要哪張照片?圖片應該有一個與它相關的時間戳,也許你可以拉取圖片的日期,並獲得最接近NOW()或curdate()的圖片以顯示最近的圖片。 ^^我不認爲你可以按順序進行分組,但是你應該選擇b.created,這樣你就可以看到它檢索圖片的順序。

+0

對不起,我忘記提及了。我想要最新插入的圖片來自'created'列下的'profile_pics'表格。 – user1011713

0

如果你可以添加一個新的派生表到您的加入(在我的子查詢被稱爲「MaxPic」一起做),你可以這樣做:

SELECT a.hometown, a.first_name, a.uid, a.last_name, 
     b.friend_one, b.friend_two, b.friend_request_id, 
     p.thumbnail 
FROM users a, 
     friend_requester b, 
     (Select MAX(Created) as Created, uid_fk from profile_pics) p_date, 
     profile_pics p 
WHERE  
     a.uid = b.friend_one AND b.friend_two = $uid AND p.uid_fk = $uid 
     AND p_date.Created=p.Created And p_date.uid_fk=p.uid_fk 
ORDER BY b.created DESC LIMIT 5 

或者,你可能想在你的PIC表「標誌」列包含1如果圖片是最新的,並且否則爲0, - 這種類型的問題似乎是它會出現很多,隨着數據庫的增長,還有mor舊照片,你會得到性能如果您每次都需要檢查每個條目,則會出現問題。使用國旗,您可以更輕鬆地爲性能編制索引。另外,這個查詢只需要添加一個:where flag = 1。每次插入新圖片時,你做出標誌1,並設置爲0。

乾杯所有用戶的其他圖片的標誌, 大衛