单个 MySQL 查询,用于使用 Union All 和基于 2 个不同的条件选择 25 条记录 (9+16)


single mysql query for choosing 25 records (9+16) using union all and based on 2 different conditions

我需要使用 mysql 获取 25 条记录,其中前 9 条必须基于从 200 个最高赞赏的likes计数(随机选择(的降序排列,并从剩余项目中随机平衡 16 个(不包括 9 个,已经过滤(。是否可以使用单个 mysql 查询来执行此操作?任何帮助将不胜感激。

这是我的查询...

(

从(选择磁贴,users.first_name,users.last_name,用户.马赛克名称,用户.国家,用户.城市,用户.州,users.profile_image,计数(tile_appreciations.TILE_ID(中选择*,作为tile_appreciationstilestile_appreciations appreciation_count。tile_id = tiles .id users 上的内部连接usersid = tiles .user_id左加入user_settings user_settingsuser_id = tiles .user_id tiles的地方.view_mode = 'PB' 和 users .status = 'Y' 和 tiles .moved_stat = '1' 和 user_settings .public_profile = "Y"组按tilesidappreciation_count DESC LIMIT 200(排序,作为T1顺序按RAND((限制9(联合所有(选择磁贴,users.first_name,users.last_name,USERS.MOSAICNAME,用户.国家,用户.城市,用户.州,users.profile_image,COUNT(tile_appreciations.TILE_ID(作为appreciation_count从tiles左连接tile_appreciations tile_appreciationstile_id = tiles .id users 上的内部连接usersid = tiles .user_id左加入user_settings user_settingsuser_id = tiles .user_id tiles的地方.view_mode = 'PB' 和 users .status = 'Y' 和 tiles .moved_stat = '1' 和 user_settings .public_profile = "Y"按tiles分组。id 按 RAND(( 排序限制 16(

我不知道

使用UNION ALL是否是一个硬性要求,但是SQL已经有一个非常好的系统来过滤第二个查询中第一个查询的结果:它被称为UNION。您可以选择剩余的 16 个,方法是将最佳 200 个中的 9 个和整个集合中的 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;