Порядок по важности, затем по группам - PullRequest
0 голосов
/ 24 марта 2019

В этой таблице схема http://sqlfiddle.com/#!9/101a9c/9/0

id  section     rev     importance
2   1           b       6
1   1           a       5
3   2           c       9
5   3           e       6
4   3           d       5

я хочу order by **importance**, затем group by **section**

, поэтому я попытался использовать GROUP BY docs.section

SELECT docs.id, docs.section, docs.rev, (
  SELECT SUM(docs_importance.importance) 
  FROM docs_importance
  WHERE docs_importance.doc_id = docs.id
) AS importance
FROM docs
GROUP BY docs.section    ---GROUPING
ORDER BY docs.section, importance DESC

но получил такой результат:

id  section     rev     importance
1   1           a       5
3   2           c       9
4   3           d       5

но ожидаемый результат должен быть

id  section     rev     importance
2   1           b       6
3   2           c       9
5   3           e       6

1 Ответ

0 голосов
/ 24 марта 2019

Это работает в более поздней версии MySql:

with 
  grp as (
    select d.section, d.id, sum(i.importance) imp
    from docs d inner join docs_importance i
    on i.doc_id = d.id  
    group by d.section, d.id  
  ),
  cte as (
    select grp.id, grp.section, grp.imp
    from grp inner join (
      select section, max(imp) maximp
      from grp
      group by section
    ) t on t.section = grp.section and t.maximp = grp.imp 
  )
select d.id, d.section, d.rev, cte.imp importance 
from docs d inner join cte
on cte.id = d.id and cte.section = d.section

См. Демоверсию Результаты:

| id  | section | rev | importance |
| --- | ------- | --- | ---------- |
| 2   | 1       | b   | 6          |
| 3   | 2       | c   | 9          |
| 5   | 3       | e   | 6          |

Для более старых версий:

select d.id, d.section, d.rev, cte.imp importance 
from docs d inner join (
    select grp.id, grp.section, grp.imp
    from (
    select d.section, d.id, sum(i.importance) imp
    from docs d inner join docs_importance i
    on i.doc_id = d.id  
    group by d.section, d.id  
  ) grp inner join (
      select section, max(imp) maximp
      from (
    select d.section, d.id, sum(i.importance) imp
    from docs d inner join docs_importance i
    on i.doc_id = d.id  
    group by d.section, d.id  
  )grp 
  group by section
    ) t on t.section = grp.section and t.maximp = grp.imp 
  )cte
on cte.id = d.id and cte.section = d.section

См. Демоверсию

...