sql >> Databáze >  >> RDS >> Mysql

Omezit výsledky na GROUP_CONCAT() nebo INNER JOIN

Tyto pokročilé jsou to, kvůli čemu miluji 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

V zásadě získám všechny řádky a vyhodím všechny fotografie, které mají ve vypočítaném rownu 6 nebo vyšší.



  1. Odstraňte duplikáty ve velké tabulce MySql

  2. Problém perských postav v databázi mysql

  3. Chování sql::SQLString

  4. Efektivní externí rozpisování pomocí MySQL a ejabberd