[英]Group two columns by occurrence and sort by time in MYSQL
我正在使用一個表,其中包含將由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但它只影響組中的文件。
更新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 ...當兩個組合具有相同的頻率時。
您可以嘗試在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.