Как использовать GROUP BY для результата с LIMIT и OFFSET? - PullRequest
0 голосов
/ 06 апреля 2019

Я использую MySQL 5.6 и у меня проблема с результатами запроса, используя GROUP BY и LIMIT + OFFEST. Эти результаты не согласуются с результатами без OFFSET. Зачем ? И в чем решение?

Этот запрос (без OFFSET и без GROUP BY) дал мне 10 результатов:

SELECT sp.couleur, sp.nom, d.degre_urgence 
FROM demande_interservices AS d 
LEFT JOIN demande_interservices_a_valider AS dv ON d.id = dv.demande_interservices_id  
LEFT JOIN demande_interservices_affectee_a_sous_pole AS d_aff ON d.id = d_aff.demande_interservices_id 
LEFT JOIN sous_pole AS sp ON d_aff.sous_pole_id = sp.id 
WHERE d.pole_sollicite_id = (SELECT pole_id FROM utilisateur WHERE id = 38) 
AND (d.statut_id = 1 OR d.statut_id = 2) 
AND dv.demande_interservices_id IS NULL 
ORDER BY d.degre_urgence DESC 
LIMIT 10

Результаты:

couleur    degre_urgence    nom
_______________________________

#cd423a    5    Communication
#cd423a    5    Communication
#ff3ebb    5    Assistante DGS
#925210    5    Police Urbanisme
#000000    5    informatique RGPD
#cd423a    5    Communication
#ff3ebb    5    Assistante DGS
#e2c63d    5    Urbanisme - Marchés Publics
#ff3ebb    5    Assistante DGS
#925210    4    Police Urbanisme

Тот же запрос с GROUP BY;

SELECT sp.couleur, sp.nom, d.degre_urgence 
FROM demande_interservices AS d 
LEFT JOIN demande_interservices_a_valider AS dv ON d.id = dv.demande_interservices_id 
LEFT JOIN demande_interservices_affectee_a_sous_pole AS d_aff ON d.id = d_aff.demande_interservices_id 
LEFT JOIN sous_pole AS sp ON d_aff.sous_pole_id = sp.id 
WHERE d.pole_sollicite_id = (SELECT pole_id FROM utilisateur WHERE id = 38) 
AND (d.statut_id = 1 OR d.statut_id = 2) 
AND dv.demande_interservices_id IS NULL 
GROUP BY nom
ORDER BY d.degre_urgence DESC 
LIMIT 10

Результаты:

couleur    degre_urgence    nom
_______________________________

#e2c63d    5    Urbanisme - Marchés Publics
#000000    5    informatique RGPD
#925210    5    Police Urbanisme
#fff000    2    Accueil    
#7bd026    1    ASVP
#cd423a    1    Communication
#ff3ebb    1    Assistante DGS

Но я ожидал таких результатов:

couleur    degre_urgence    nom
_______________________________

#cd423a    5    Communication
#ff3ebb    5    Assistante DGS
#925210    5    Police Urbanisme
#000000    5    informatique RGPD
#e2c63d    5    Urbanisme - Marchés Publics

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы должны сгруппировать результаты первого запроса:

select t.nom, min(t.couleur) from (
  SELECT sp.couleur, sp.nom 
  FROM demande_interservices AS d 
  LEFT JOIN demande_interservices_a_valider AS dv ON d.id = dv.demande_interservices_id 
  LEFT JOIN demande_interservices_affectee_a_sous_pole AS d_aff ON d.id = 
  d_aff.demande_interservices_id 
  LEFT JOIN sous_pole AS sp ON d_aff.sous_pole_id = sp.id 
  WHERE d.pole_sollicite_id = (SELECT pole_id FROM utilisateur WHERE id = 38) 
  AND (d.statut_id = 1 OR d.statut_id = 2) 
  AND dv.demande_interservices_id IS NULL 
  ORDER BY d.degre_urgence DESC 
  LIMIT 10
) t
GROUP BY t.nom

MySql позволяет использовать couleur вместо min (couleur), хотя это не стандарт sql.

0 голосов
/ 06 апреля 2019

Вы можете использовать min () и группировать по

SELECT min(sp.couleur), sp.nom 
FROM demande_interservices AS d 
LEFT JOIN demande_interservices_a_valider AS dv ON d.id = dv.demande_interservices_id  
  AND dv.demande_interservices_id IS NULL 
LEFT JOIN demande_interservices_affectee_a_sous_pole AS d_aff ON d.id = d_aff.demande_interservices_id 
LEFT JOIN sous_pole AS sp ON d_aff.sous_pole_id = sp.id 
WHERE d.pole_sollicite_id = ( SELECT pole_id FROM utilisateur WHERE id = 38) 
AND (d.statut_id = 1 OR d.statut_id = 2) 
GROUP BY sp.nom 
LIMIT 10 
...