Проблема с выбором группы условий Mysql по заказу - PullRequest
1 голос
/ 16 сентября 2011

Каждый сервис имеет разные KPI.Эти KPI упорядочены в порядке полей в таблице checklist_has_kpi.Я хочу получить список отдельных услуг, упорядоченных по заказу, назначенному для KPI.

У меня есть этот запрос:

SELECT s.serviceid, s.servicenameit, s.servicenameen 
FROM services s, kpi k, checklist_has_kpi chk 
WHERE s.serviceid=k.serviceid AND k.kpiid=chk.kpiid AND k.inreport='yes' AND chk.checklistid=61 
GROUP BY s.serviceid ORDER BY chk.order ASC

Но он не дает ожидаемого результата, и я непонять что не так в написанном мной запросе.Дай мне руку?Если что-то неясно, просто спросите!спасибо

1 Ответ

2 голосов
/ 16 сентября 2011

Если вы добавите

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY';

Тогда вы увидите, почему другие СУБД не разрешают этот синтаксис:

  • 3 неагрегированных столбца в SELECT, но один в GROUP BY
  • Столбец ORDER BY не находится в GROUP BY / SELECT и не агрегируется

Если вы хотите GROUP BY, а не DISTINCT, то вам нужно GROUP BY все столбцы в SELECT

SELECT s.serviceid, s.servicenameit, s.servicenameen 
FROM services s, kpi k, checklist_has_kpi chk 
WHERE s.serviceid=k.serviceid AND k.kpiid=chk.kpiid AND k.inreport='yes' AND chk.checklistid=61 
GROUP BY s.serviceid, s.servicenameit, s.servicenameen

Но тогда у вас нет chk.order для заказа, используя GROUP BY или DISTINCT

Так что по этому поводу, полностью игнорируя дубликаты?

SELECT s.serviceid, s.servicenameit, s.servicenameen 
FROM services s, kpi k, checklist_has_kpi chk 
WHERE s.serviceid=k.serviceid AND k.kpiid=chk.kpiid AND k.inreport='yes' AND chk.checklistid=61 
ORDER BY chk.order ASC

Или это для ЗАКАЗА по самому раннему заказу в 3х services столбцах

SELECT s.serviceid, s.servicenameit, s.servicenameen 
FROM services s, kpi k, checklist_has_kpi chk 
WHERE s.serviceid=k.serviceid AND k.kpiid=chk.kpiid AND k.inreport='yes' AND chk.checklistid=61 
GROUP BY s.serviceid, s.servicenameit, s.servicenameen
ORDER BY MIN(chk.order)
...