微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP-在MYSQL中按发生时间将两列分组并按时间排序

我正在使用一个表,其中包含将由激光切割机处理的上载文件的列表.

为了提高效率,我需要列出具有相同材质和颜色的文件,以显示相同组合的数量.然后在发送时订购.

这是一个非常简化的表格示例:

File Table Example

从上面的示例表中,我想要获得以下结果:

6    File Number 6    Plastic    Red     9am
4    File Number 4    Plastic    Red     10am
5    File Number 5    Plastic    Red     10:30am
1    File Number 1    Card       Blue    9am
2    File Number 2    Card       Blue    9:30am
7    File Number 7    Plastic    Purple  8am
3    File Number 3    Card       Green   9am

因此,在材料和颜色都出现最多的地方,相应的行位于顶部,而在该行中,最早的文件位于顶部.

如您所见,红色塑料最常出现在顶部.单个文件仅按时间排序,如文件7和3所示.

理想情况下,我想在一个MYSQL查询中执行此操作,但鉴于其复杂性,我不确定是否可能.也许存储结果并遍历数组?

我几乎可以通过以下查询实现此目的:

SELECT * 
FROM propellor.pro_files 
GROUP BY material, colour 
ORDER BY count(*) DESC, 
   material DESC, 
   colour DESC, 
   sent DESC;

尽管似乎订购的顺序几乎正确,但每种材料/颜色组合仅返回单行.

值得注意的是color列可以为null.

有关如何将它们分组的想法,下面是它在实践中的外观:

Grouping example

更新:材料/颜色组现在已正确排序,但是当我需要反过来的时候,单个文件从最新到最旧的顺序被排序,我尝试使用已发送的ASC / DESC进行播放,但它只影响组中的文件.

Sort example

更新2:这是我当前的完整MYSQL查询

SELECT * 
FROM propellor.pro_files

INNER JOIN propellor.pro_users ON propellor.pro_files.userid=propellor.pro_users.userid

INNER JOIN (
SELECT material, colour, count(*) AS occ 
FROM propellor.pro_files
GROUP BY material, colour
) 

AS mcCounts 
USING (material, colour)
WHERE status =1 AND laser=1
ORDER BY mcCounts.occ DESC,
material,
colour,
propellor.pro_files.timesent ASC
;

解决方法:

您可以单独计算计数,尽管可以在单个查询中完成所有计算;这应该做到这一点:

SELECT pf.* 
FROM propellor.pro_files AS pf
INNER JOIN (
   SELECT material, colour, count(*) AS occ 
   FROM propellor.pro_files
   GROUP BY material, colour 
) AS mcCounts USING (material, colour)
ORDER BY mcCounts.occ DESC
   , material, colour
   , pf.sent DESC
;

编辑:当两个组合具有相同的频率时,将材料,颜色添加到ORDER BY….

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐