2012-04-17 75 views
3

我已經詳細地討論了討論group_concat()和內部連接限制的其他線程,但沒有找到我的答案,所以我想我會繼續問它:在GROUP_CONCAT()或INNER JOIN上限制結果

我正在開發一個現有的照片社區網站。我想要檢索在某一天(今天)有生日的會員,然後檢索每個會員的5張評分最高的照片。但我也只想要10個「最喜歡的」生日成員(即最喜歡的人數)。下面是我有:

SELECT users.user_id, users.user_name, 
     GROUP_CONCAT(CONVERT(photos.photo_id,char(32)) 
        ORDER BY photos.average_rate) as photo_ids 
FROM users 
INNER JOIN photos ON photos.user_id=users.user_id 
WHERE users.day_of_birth = DATE_FORMAT('2012-04-17', '%m-%d') 
    AND users.photo_count>0 
GROUP BY users.user_id 
ORDER BY users.favorite_count DESC, users.photo_count DESC LIMIT 0,10 

此我想要做什麼,但我可以的photo_id S上的量不限制爲5。這是一個問題,因爲輸出將JSON發送到應用程序,以及一些成員已經上傳了2萬多張照片,導致了無法接受的長輸出字符串。似乎爲我工作的唯一「解決方案」是將服務器變量group_concat_max_len設置爲合理的,它將保存至少5個ID,但這非常不可靠和不可靠。有沒有什麼辦法可以用一個查詢返回每個用戶5 photo_id?或者我需要在我的PHP中做一個循環?

我不一定需要用逗號分隔值的photo_id,我也可以完全拋棄group_concat()方法,並且如果這更可行,則執行內部連接。但即使在那裏,我不知道的方式將結果限制爲5

+0

檢查['[[最大每個組] [](http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql)標記或**相關* *, 在右邊。 – 2012-04-17 13:35:54

+0

我環顧四周,但找不到適合我個人情況的答案......或者我的SQL-fu不夠好,不適合我的情況(更可能是後者)。 – indorock 2012-04-18 10:31:09

回答

0
SELECT u.user_id 
    , u.user_name 
    , GROUP_CONCAT(p.photo_id ORDER BY p.average_rate) AS photo_ids 
FROM 
    (SELECT user_id 
      , user_name 
      , favorite_count 
      , photo_count 
     FROM users 
     WHERE day_of_birth = DATE_FORMAT('2012-04-17', '%m-%d') 
     AND photo_count > 0 
     ORDER BY favorite_count DESC 
      , photo_count DESC 
     LIMIT 10 
    ) AS u 
    INNER JOIN 
    photos AS p 
     ON p.user_id = u10.user_id 
     AND p.average_rate >= 
      (SELECT pp.average_rate 
      FROM photos AS pp 
      WHERE pp.user_id = u10.user_id 
      ORDER BY pp.average_rate DESC 
      LIMIT 1 OFFSET 4 
     ) 
GROUP BY u.user_id 
ORDER BY u.favorite_count DESC 
     , u.photo_count DESC 
1

這些先進的有什麼讓我愛的MySQL :)

SELECT user_id, user_name, 
    GROUP_CONCAT(CONVERT(photo_id, char(32)) ORDER BY photos.average_rate) as photo_ids 
FROM ( SELECT user_id, user_name, photo_id, favorite_count, photo_count, 
      (case when @user_id = user_id then @rownum := @rownum + 1 else CONCAT(@rownum := 1, @user_id := user_id) end) AS dummy_val 
     FROM ( SELECT users.user_id, users.user_name, users.favorite_count, users.photo_count, photos.photo_id 
       FROM users 
       INNER JOIN photos 
       ON photos.user_id=users.user_id 
       WHERE users.day_of_birth = DATE_FORMAT('2012-04-17', '%m-%d') 
        AND users.photo_count > 0 
       ORDER BY users.id ASC, photos.average_rate ASC 
      ) AS h, 
      ( @rownum := NULL, 
       @user_id := NULL 
      ) AS vars 
     HAVING rownum <= 5) AS h2 
GROUP BY user_id 
ORDER BY favorite_count DESC, photo_count DESC LIMIT 0, 10 

Basicly我得到的所有行,扔掉計算好的rownum中所有6張以上的照片。