按人行横道中存在的计数排序 MySQL 8 个结果 table

Ordering MySQL 8 results by count existence in a crosswalk table

我有以下 MySQL 8 tables:

[submissions]
===
id
submission_type
name

[reject_reasons]
===
id
name

[submission_reject_reasons] -- crosswalk joining the first 2 tables
===
id
submission_id
reject_reason_id

在我的应用程序中,用户可以提交提交,其他用户可以请求更改这些提交。当他们请求这些拒绝时,1+ 个条目将保存到 submission_reject_reasons table(其中存储请求拒绝的提交 ID,以及拒绝原因的 ID正在制作)。因此 table 中的典型条目可能如下所示:

id      submission_id     reject_reason_id
==============================================
45      384               294

其中 submission_id = 384 是“Fizz Buzz”提交,reject_reason_id = 294 是“缺少必填字段”的原因。

我目前有一个从数据库中提取所有 reject_reasons 的查询:

SELECT * FROM reject_reasons

我现在想修改此查询以根据使用频率对结果进行排序。意味着查询当前可能 return:

294 | Missing Required Field
14 | Malformed Entry
1885 | Makes No Sense

等但是假设 submission_reject_reasons table 中有 5 个条目,其中 294(缺少必填字段)是 reject_reason_id,并假设有 15 个条目,其中 1885(毫无意义)存在,和 120 个条目,其中存在 14 个(格式错误的条目)。我需要一个查询 returns 所有 reject_reasons 按它们在 submission_reject_reasons (SRR) table 中的计数排序,降序排列,以便最常用的出现在排序中的较早位置.因此结果集将是:

14 | Malformed Entry --> because there are 120 instances of this in the SRR table
1885 | Makes No Sense --> because there are 15 instances in the SRR
294 | Missing Required Field --> because there are only 5 instances in the SRR

此外,我需要一个从最常用到最不常用的排名。如果 SRR table 中不存在原因,它应该有一个默认的“计数”为零 (0),但仍应在查询中返回。如果 2 个以上的原因计数并列,那么我不在乎它们是如何排序的。这里有什么想法吗?我需要最终结果集只包含 rr.idrr.name field/values.

我最好的尝试就是没有让我到任何地方:

SELECT rr.id, rr.name
FROM reject_reasons AS rr
LEFT JOIN submission_reject_reasons AS srr on rr.id = srr.reject_reason_id
GROUP BY rr.id
ORDER BY COUNT(*) DESC

谁能帮我冲过终点线?谁能发现我哪里出错了?提前致谢!

您应该按拒绝原因 ID 分组。 COUNT(*) 是您要在每组中计算的内容。

SELECT rr.id, rr.name
FROM reject_reasons AS rr
JOIN submission_reject_reasons AS srr on rr.id = srr.reject_reason_id
GROUP BY rr.id
ORDER BY COUNT(*) DESC

不需要任何 EXISTS 检查,因为 INNER JOIN 不会 return 任何 submission_reject_reasons 中不存在的拒绝原因。