簡體   English   中英

限制GROUP_CONCAT()或INNER JOIN的結果

[英]Limit results on an GROUP_CONCAT() or INNER JOIN

我已經廣泛地閱讀了其他關於group_concat()和內部聯接的限制的線程但是沒有找到我的答案,所以我想我會繼續問它:

我正在開發一個現有的照片社區網站。 我想檢索在某一天(今天)過生日的會員,然后檢索每個會員的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的數量限制為5.這是一個問題,因為輸出將作為JSON發送到應用程序,並且一些成員已經上傳了超過20,000張照片,導致不可接受長輸出字符串。 似乎對我group_concat_max_len的唯一“解決方案”是將服務器變量group_concat_max_len設置為合理的,至少可以容納5個ID,但這非常hacky且不可靠。 有沒有辦法通過一個查詢返回每個用戶5個photo_id 或者我需要在PHP中循環嗎?

我不一定需要以逗號分隔值的photo_id,我也可以完全拋棄group_concat()方法,如果更可行則進行內連接。 但即使在那里,我也沒有意識到將結果限制為5的方法。

這些先進的是讓我愛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

基本上我得到所有行,並丟棄計算出的rownum中6或更高的所有照片。

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM