按出现次数对两列进行分组,并在MYSQL中按时间排序

时间:2015-09-02 17:59:29

标签: php mysql apache

我正在使用一个表,其中包含将由Laser Cutter处理的上传文件列表。

为了提高效率,我需要列出具有相同材料颜色的文件,以便发生相同组合的数量。然后在发送时订购。

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

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;

虽然这似乎几乎正确地排序,但它只返回每个材质/颜色组合的单行。

值得注意的是,颜色列可以是null

关于我如何对它们进行分组的想法,以下是它在实践中的表现:

Grouping example

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

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
;

2 个答案:

答案 0 :(得分:2)

你需要分别计算计数,尽管它可以在一个查询中完成;这应该这样做:

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 ...

答案 1 :(得分:1)

您可以尝试在sql select中创建计数列,然后按这些计数进行排序

select count(material) over partition by material) as materialCount
       , count(colour) over partition by colour) as colourCount
       , ..... other columns
from   propellor.pro_files
order by materialCount desc, colourcount desc