热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phplaravel排序,laravel中用groupby和orderby排序不正确的问题解决翟码农技术博客...

最近做数据统计,类如数据库里明明有11月30号的数据,我也明明按时间降序排序了,可是最终获取的数据时间,却不是11月30号这

最近做数据统计,类如数据库里明明有11月30号的数据,我也明明按时间降序排序了,可是最终获取的数据时间,却不是11月30号这个最大时间,而是其它时间。

最终找出的问题原因就是:mysql中order by是在group by之后执行的,而group by则是在同一组数据里挑选出id最小的数据记录作为汇总记录

可能有点模糊,下面拿我的博客举例子。

在实践之前,我先贴出我的服务器mysql版本:mysql Ver 15.1 Distrib 5.5.56-MariaDB

假如我要查询我的博客每个分类下最新的文章,我写了如下Sql语句:select count(*) as count,news_id,title, cate_id, from_unixtime(create_time) from news n group by n.cate_id order by n.create_time desc;

查询的结果如下图:

5d0c32b273f7a8026bef4dab6ad0eede.png

图中高光的是我博客的php分类,但php分类下我最近一直在更新文章,所以php分类下最新的文章发布时间绝对不会是2017年。

正如上面原因提到的,group by会先于order by从我的博客每个分类下的文章组里挑出当组id最小的数据来展示。

所以网上常有group by和order by连用后数据排序不对的问题。

我把上面sql语句,改写成如下,即在子查询里先用order by将数据按时间降序排号,然后再group by:SELECT count(*) as count, tmp.* FROM (SELECT news_id,title, cate_id, from_unixtime(create_time) FROM news ORDER BY create_time DESC) tmp GROUP BY tmp.cate_id

我以为会成功,事实并没有,此次执行结果如下图所示:

99195c81bd0fea39737b495ee54da971.png

由图中高光时间可知,并未成功。

经过了解, 上面mysql子查询里order by之后必须要跟上limit,否则mysql优化会将上面mysql语句里的order by给优化掉。

改成如下,执行结果就ok了。看图中数据的时间部分就可辨别。SELECT count(*) as count, tmp.* FROM (SELECT news_id,title, cate_id, from_unixtime(create_time) FROM news ORDER BY create_time DESC LIMIT 1000) tmp GROUP BY tmp.cate_id

执行结果:

d57454cc781eafc6c6831d2dc4bd2361.png

本文是翟码农个人博客蓝翟红尘里php分类下的文章,转载请注明出处:http://www.zhai14.com/blog/2ade3f69c8410f534658e5a1d98b0ea3.html

好了,上面是Mysql语句解决order by和group by混用排序失效的方法。

那么在Laravel框架中,该怎么实现上述mysql语句的效果呢。

废话不多说了,直接上代码吧:$query = News::where('created_at', '>', $startTime)

->where('created_at', '

->where('status', 1)

->whereIn('cate_id', [1,2,3,4])

->select(DB::raw(" news_id,title, cate_id, from_unixtime(create_time) "));

$binding = $query->getBindings(); //获取where条件数据

$sqlStr = $query->toSql();

//上面sqlStr打印出来,其中条件参数都是问号?,现在我们要将其替换成where条件的具体值

$afterSql = str_replace('?', "'?'", $sqlStr);

$realSql = vsprintf(str_replace('?', '%s', $afterSql), $binding );

$sortResult = DB::table(DB::raw("({$realSql}) as tmp"))

->groupBy('tmp.cate_id')

->get();

上面代码里DB::table后面调用get方法得到的数据结构形式如下:[ Object(StdClass), Object(StdClass)]

foreach遍历上述结果$sortResult,每个Item都是对象,导致不能数组方式获取数据。

如果要用数组方式获取数据,就需要先将数组处理下。

数组不大时,即不考虑什么变量空间,采取如下解决方案即可:$newSortResult = array_map(function($item){

return $item->toArray();

}, $sortResult);

2019年12月04日 12:41文章创建

2019年12月04日 23:21文章发布



推荐阅读
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
author-avatar
藏A组合别_577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有