【发布时间】:2022-01-11 13:43:24
【问题描述】:
我在 Spring JPA Repository 上运行这个复杂的查询。
我的目标是从站点表中获取所有信息,并按每个站点上的事件严重性对其进行排序。
这是我的查询:
SELECT alls.* FROM sites AS alls JOIN
(
SELECT distinct ets.id FROM
(
SELECT s.id, et.`type`, et.severity_level, COUNT(et.`type`) FROM sites AS s
JOIN users_sites AS us ON (s.id=us.site_id)
JOIN users AS u ON (us.user_id=u.user_id)
JOIN areas AS a ON (s.id=a.site_id)
JOIN panels AS p ON (a.id=p.area_id)
JOIN events AS e ON (p.id=e.panel_id)
JOIN event_types AS et ON (e.event_type_id=et.id)
WHERE u.user_id="98765432-123a-1a23-123b-11a1111b2cd3"
GROUP BY s.id , et.`type`, et.severity_level
ORDER BY et.severity_level, COUNT(et.`type`) DESC
) AS ets
) as etsd ON alls.id = etsd.id
第二个选择(带有“distinct”的那个)返回按严重性正确排序的site_ids。 请注意,每个站点都有不同的 event_types + 严重性,我在答案上使用了分页,所以我需要不同的。
问题是 - 主选择没有保持这个顺序。 有没有办法在一个复杂的查询中保持顺序?
另一个相关问题 - 我的一个想法是提出两个查询:
- 将返回订单的“选择不同”查询 --> 保存在“订单列表”列表中
- 主“站点”查询(变得非常简单)与“where id in {“order list”}
- 按“订单列表”对代码中的第二个查询进行排序。
我每 10 秒使用一次查询,因此它对性能非常敏感。 在这种情况下,什么似乎更快 - 原始复杂查询或那些 2?
任何见解将不胜感激。 Tnx 很多。
【问题讨论】:
-
您在 ets.id 上的表现与众不同。为什么不重写查询并按 ets.id 分组,那么您根本不需要嵌套查询
-
希望我理解正确 - 我需要嵌套查询来获得正确的顺序。我得到每个站点中事件的严重性和数量,然后我可以得到正确的顺序。我在 ets 中没有订单信息。
-
请问什么版本的 MySQL?
-
然后你可以在那个级别上做一个 group by 而不是 distinct
-
@O.Jones MySQL 5.7 版
标签: mysql query-optimization aggregate-functions