如何在具有 LIMIT 和 OFFSET 的结果上使用 GROUP BY?
How to use GROUP BY on a result with LIMIT and OFFSET?
我使用 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
您可以使用 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
您必须对第一个查询的结果进行分组:
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 标准。
我使用 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
您可以使用 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
您必须对第一个查询的结果进行分组:
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 标准。