我正在使用一个表,其中包含将由Laser Cutter处理的上传文件列表。
为了提高效率,我需要列出具有相同材料和颜色的文件,以便发生相同组合的数量。然后在发送时订购。
这是一个非常简化的表格示例:
从上面的示例表中我想获得以下结果:
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
。
关于我如何对它们进行分组的想法,以下是它在实践中的表现:
更新:材料/颜色组现在正确排序,但是当我需要时,单个文件从最新到最旧排序,我尝试使用发送的ASC / DESC进行播放,但它只影响组中的文件。 / p>
更新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
;
答案 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