I need to fetch 25 records using mysql out of which first 9 must be based on the descending order of likes count (chosen randomly) from 200 top appreciated and balance 16 randomly from the remaining items (excluding 9, that are already filtered). Is it possible to do this using a single mysql query? Any help will be appreciated.

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

Here is my query...

这是我的查询......

(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 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) 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 16)

(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用户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 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)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 16)

1 个解决方案

#1


1

I don't know if using UNION ALL is a hard requirement, but SQL already has a very good system for filtering out results from the first query in the second query: it is called UNION. You can choose the remaining 16 by taking the union of 9 of the best 200 and 25 of the whole set and then limiting the total result to 25. I'm assuming here that UNION will remove duplicates from the second set and not the first.

我不知道使用UNION ALL是否是一项硬性要求,但SQL已经有了一个非常好的系统来过滤掉第二个查询中第一个查询的结果:它被称为UNION。你可以选择剩余的16个,取最好的200个中的9个和整个集合中的25个,然后将总结果限制为25.我在这里假设UNION将从第二组中删除重复,而不是第一组。

Try something like this:

尝试这样的事情:

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. 使用JavaScript显示HTML文本框中剩余的字符数
  2. 时间总是过得比你想像中的快,理想总是会被四周的事情所掩盖,希望能
  3. 在C#.net的server explorer 上建立的数据库,在sql server managem
  4. GridView中实现元素填充剩余空间(自适应)

随机推荐

  1. 《PHP核心技术与最佳实践》P37中间有一句
  2. php把从数据库读取出来的数据存放到数组
  3. php 谈谈我对session, cookies和jwt的理
  4. 当我将它移动到另一台服务器时,计数器将无
  5. 案例:用Redis来存储关注关系(php版)
  6. 如何在进行单元测试时覆盖php://输入
  7. 如何在mysql中配置区分大小写的数据库标
  8. 在两个不同的地方分割/爆炸一个PHP字符串
  9. 如何用jQuery AJAX调用发送所有当前的pos
  10. PHP实例————万年历