One mysql query to select 25 records (9 + 16) using the union of all and based on two different conditions

I need to get 25 records using mysql, of which the first 9 should be based on the descending order of likescount ( randomly selected ) from the 200 best rated and 16 balance randomly from the rest of the elements ( excluding 9 that are already filtered ). Can this be done with a single mysql query? Any help would be appreciated.

Here is my request ...

(SELECT * FROM (SELECT tiles., Users.first_name, users.last_name, users.mosaicname, users.country, users.city, users.state, users.profile_image, COUNT (tile_appreciations.tile_id) AS appreciation_count FROM tilesLEFT JOIN tile_appreciationsON tile_appreciations. tile_id= tiles. idINNER JOIN usersON users. id= tiles. user_idLEFT JOIN user_settingsON user_settings. user_id= tiles. user_idWHERE tiles. view_mode= 'PB' AND users. status= 'Y' AND tiles. moved_stat= '1' AND user_settings. public_profile= 'Y' GROUP BY tiles. idORDER BYappreciation_countDESC LIMIT 200) as t1 ORDER BY RAND () LIMIT 9) UNION ALL (SELECT tiles., Users. First_name, users.last_name, users.mosaicname, users.country, users.city, users.state, users.profile_image, COUNT (tile_appreciations.tile_id) appreciation_count AS FROM tilesLEFT JOIN tile_appreciationsON tile_appreciations. tile_id= tiles. idINNER JOIN usersON users. id= tiles. user_idLEFT JOIN user_settingsON user_settings. user_id= tiles. user_idWHERE tiles. view_mode= 'PB' AND users. status= 'Y' AND tiles. moved_stat= '1' AND user_settings. public_profile= 'Y' GROUP BY tiles. idORDER RAND () LIMIT 16)

+4
1

, UNION ALL , SQL : UNION. 16, 9 200 25 , 25. , UNION , .

- :

SELECT * FROM (
    SELECT * FROM (
        SELECT tiles.*,users.first_name,users.last_name, users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count 
        FROM tiles LEFT JOIN tile_appreciations ON tile_appreciations.tile_id = tiles.id INNER JOIN users ON users.id = tiles.user_id LEFT JOIN user_settings ON user_settings.user_id = tiles.user_id 
        WHERE tiles.view_mode = 'PB' AND users.status = 'Y' AND tiles.moved_stat = '1' AND user_settings.public_profile = 'Y' 
        GROUP BY tiles.id 
        ORDER BY appreciation_count DESC LIMIT 200
    ) as best200
    ORDER BY RAND() 
    LIMIT 9
) UNION (
    SELECT tiles.*,users.first_name,users.last_name,users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count 
    FROM tiles LEFT JOIN tile_appreciations ON tile_appreciations.tile_id = tiles.id INNER JOIN users ON users.id = tiles.user_id LEFT JOIN user_settings ON user_settings.user_id = tiles.user_id 
    WHERE tiles.view_mode = 'PB' AND users.status = 'Y' AND tiles.moved_stat = '1' AND user_settings.public_profile = 'Y' 
    GROUP BY tiles.id 
    ORDER BY RAND() 
    LIMIT 25
)
LIMIT 25;
+1

Source: https://habr.com/ru/post/1619815/


All Articles