2011-08-20 104 views
3
 SELECT 
      u.*, 
      ur.friend_id, 
      COUNT(
       IF(um.to_user_id = ?, 
        (IF(um.`date` >= ulr.last_read,um.message_id,NULL)) 
       ,NULL) 
      ) as new_messages 
      ,i.t_1 AS user_photo 
     FROM user_relationships ur 
     LEFT JOIN `user` u ON u.user_id=ur.friend_id 
     LEFT JOIN user_messages um ON um.from_user_id=ur.friend_id 
     LEFT JOIN user_last_read ulr ON ulr.read_who=ur.friend_id 

     LEFT JOIN ads a ON a.user_id=u.user_id 
     LEFT JOIN images i ON a.id=i.ad_id 

     WHERE ur.user_id=? 
     GROUP BY ur.friend_id 
     ORDER BY new_messages DESC 

我需要這部分i.t_1 AS user_photo是在DESC順序,因爲可以有多個user_photos,我需要選擇最新的一個。MySQL的:ORDER BY加入表列

我已經用GROUP_CONCAT(i.t_1 ORDER BY i.image_id DESC) AS user_photo的舊解決方案。 但我只需要一個圖像,而不是全部可用。 :)

感謝;)

+0

你的問題到底在哪裏?這個查詢不起作用嗎?你需要修改這個查詢來做其他事嗎?不要讓我們猜測。 – cdhowie

+0

我需要i.t_1 AS user_photo以DESC順序保持ORDER BY new_messages DESC不變。 – Somebody

+0

你想先點什麼?這聽起來像你要麼'ORDER BY new_messages DESC,i.t_1 DESC'或'ORDER BY i.t_1 DESC,new_messages DESC'。 – cdhowie

回答

0
SELECT 
    u.*, 
    ur.friend_id, 
    COUNT(
     IF(um.to_user_id = ?, 
      (IF(um.`date` >= ulr.last_read,um.message_id,NULL)) 
     ,NULL) 
    ) as new_messages, 
    (
     SELECT t_1 
     FROM images 
     WHERE ad_id = a.id 
     ORDER BY t_1 DESC 
     LIMIT 1 
    ) AS user_photo 
FROM 
    user_relationships ur 
    LEFT JOIN `user` u ON u.user_id=ur.friend_id 
    LEFT JOIN user_messages um ON um.from_user_id=ur.friend_id 
    LEFT JOIN user_last_read ulr ON ulr.read_who=ur.friend_id 
    LEFT JOIN ads a ON a.user_id=u.user_id 
WHERE ur.user_id=? 
GROUP BY ur.friend_id 
ORDER BY new_messages DESC 
+0

是的,我已經嘗試過。子查詢中的邏輯太多:)。我必須把所有連接放在那裏,因爲子查詢應該只選擇朋友的圖像等。 – Somebody

+0

@Beck我不明白。你能解釋更多嗎?這個查詢不會給你所需的結果嗎? – Karolis

0

很難100%肯定不看錶中創建報表,但是這樣的事情應該工作:

GROUP BY ur.friend_id, i.ad_id ORDER BY new_messages DESC, i.t_1 DESC 

順便說一句,我想你」對你的數據庫過於苛刻。從查詢中拉出一些邏輯到應用程序,腳本語言通常可以做得比數據庫引擎更好。

+0

不,返回公佈的行。 – Somebody