如何在LIMIT和OFFSET的结果上使用GROUP BY?

问题描述 投票:-1回答:2

我使用MySQL 5.6,我使用GROUP BYLIMIT + 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
mysql group-by limit offset
2个回答
1
投票

您必须对第一个查询的结果进行分组:

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
投票

你可以使用min()和group by

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 
© www.soinside.com 2019 - 2024. All rights reserved.