zoukankan      html  css  js  c++  java
  • mysql 排序后在查询

    今天写sql 的时候,遇到一个问题,有一个图书表和一个章节表

    book{ id,name,cover}   chapter{id,bid,rank,content,title}

    我需要随机五本书,并且获取这五本书的最新章节和标题    ,rank代表多少章

    我的sql是:

    select t.* from
    (select b.* ,c.rank,c.title from book b
    inner join chapter c on c.bid=b.id
    order by c.rank desc)as t group by t.id

    导出来的数据永远都是第一章,而不是最后一章,后来在网上查了一下,在mysql 5.7版本一下,

    这个sql是没有问题的,但是要是版本超过>=5.7,就有问题,

    MySql 5.7对子查询进行了优化,认为子查询中的order by可以进行忽略

    那么大于5.7的解决方法,就是:

    1:

    select t.* from
    (select b.* ,c.rank,c.title from book b
    inner join chapter c on c.bid=b.id
    order by c.rank desc limit 1000000)as t group by t.id

    需要 设置一下查询的个数大小,limit无穷大,这两个sql唯一的不同就在于此

    当然这个limit的最大值就是章节表的count(*)总个数

    这样运行结果就和预想的一样了,

    2:

    select * from chapter a where N >(select count(*) from chapter b where a.bid=b.bid and a.rank<b.rank)  order by a.bid, a.rank desc;

    方法1中使用limit,需要limit的范围足够大能包括所有数据,并且每种分类只会显示一条数据,但是数据较多时运行效率要比方法2快上很多,方法2能够控制每种分类显示多少条数据,把N换成需要显示对应的数字即可。

    例如只想保留最大章节的记录 只需要把N写成1  就可以了

  • 相关阅读:
    2019-9-2-正则表达式30分钟入门教程
    2019-6-23-开源项目使用-appveyor-自动构建
    2019-8-29-dotnet-core-使用-sqlite-部署到-Centos-服务器
    2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译
    2019-4-29-dotnet-通过-WMI-获取系统安装软件
    2018-12-24-win10-uwp-求两个矩形相连的几何
    shell公共函数functions
    linux防火墙和SELinux
    ubuntu开启ssh
    文件夹操作
  • 原文地址:https://www.cnblogs.com/foreverstudy/p/10335109.html
Copyright © 2011-2022 走看看