2016-05-21 2 views
0

J'ai une requête qui crée un compte avec INNER JOIN sur une requête dans MySQL, mais j'ai besoin de SUM les lignes répétées après avoir fait cette requête dans la colonne TOTAL. La requête MySQL est:Comment simplifier le résultat de colonnes répétées après avoir fait une requête COUNT dans MySQL?

SELECT COUNT(*) AS TOTAL, 
    usuarios.nombres_user AS NOMBRE 
FROM usuarios 
INNER JOIN usuarios_login ON usuarios.id_user = usuarios_login.id_user 
INNER JOIN roles ON usuarios_login.id_rol_login = roles.id_rol 
INNER JOIN actividades ON actividades.usuario_actividad = usuarios_login.id_login 
INNER JOIN prospectos ON prospectos.Id_prospecto = actividades.id_prospecto_actividad 
INNER JOIN familias_prospectos ON familias_prospectos.Id_familia_prospecto = prospectos.familia_prospecto_id 
INNER JOIN campus ON campus.id_camp = familias_prospectos.id_campus_familias_prospectos 
WHERE roles.nombre_rol LIKE '%CRM%' 
    AND campus.id_camp = 2 
GROUP BY (usuarios_login.id_login), prospectos.Id_prospecto 
ORDER BY usuarios.nombres_user ASC 

Cette requête me donne le nombre total d'un utilisateur dans une colonne GROUP BY et seules les valeurs totales et Nombré. Ainsi, après un fait cela, je veux simplifier la requête, comme (ceci est un exemple que ma requête a fait avant):

My Query give me: 
----------------- 
TOTAL | NOMBRE 
----------------- 
    2  John 
    1  John 
    4  John 
    6  Peter 
    3  Peter 
    1  Peter 
    4  Robert 
    2  Robert  
And the Goal is try to get: 
----------------- 
TOTAL | NOMBRE 
----------------- 
    7  John 
    10 Peter 
    6  Robert 

Je travaille en PHP et MySQL, il y a une façon aussi faire ce directement avec une requête dans MySQL? J'espère que tu m'aideras. Je vous remercie.

+0

SELECT nombre, SUM (total) total provenant de (votre requête) GROUP BY nombre – Strawberry

Répondre

0

Vous devriez probablement utiliser HAVING.

SELECT 
    COUNT(*)    AS TOTAL, 
    usuarios.nombres_user AS NOMBRE 
FROM usuarios 
    INNER JOIN usuarios_login ON usuarios.id_user = usuarios_login.id_user 
    INNER JOIN roles ON usuarios_login.id_rol_login = roles.id_rol 
    INNER JOIN actividades ON actividades.usuario_actividad = usuarios_login.id_login 
    INNER JOIN prospectos ON prospectos.Id_prospecto = actividades.id_prospecto_actividad 
    INNER JOIN familias_prospectos ON familias_prospectos.Id_familia_prospecto = prospectos.familia_prospecto_id 
    INNER JOIN campus ON campus.id_camp = familias_prospectos.id_campus_familias_prospectos 
GROUP BY (usuarios_login.id_login), prospectos.Id_prospecto 
HAVING roles.nombre_rol LIKE '%CRM%' AND campus.id_camp = 2 
ORDER BY usuarios.nombres_user ASC 
+0

Ce code donne une erreur. Je n'utilise pas Ayant parce que j'ai entendu que ce n'est pas la meilleure façon de le faire. Merci. –

+0

@Urban Peut-être que dans votre question, vous devriez fournir des informations comme celle-ci. –

0

Vous obtenez les utilisateurs de doublons parce que vous faites vos GROUP BY sur 2 valeurs: id_login et Id_prospecto

Vous pouvez mieux comprendre votre résultat si vous ajoutez les 2 champs que vous groupez dans votre déclaration SELECT, comme celui-ci

SELECT COUNT(*) AS TOTAL, 
    usuarios.nombres_user AS NOMBRE, usuarios_login.id_login, prospectos.Id_prospecto 
FROM usuarios 
INNER JOIN usuarios_login ON usuarios.id_user = usuarios_login.id_user 
INNER JOIN roles ON usuarios_login.id_rol_login = roles.id_rol 
INNER JOIN actividades ON actividades.usuario_actividad = usuarios_login.id_login 
INNER JOIN prospectos ON prospectos.Id_prospecto = actividades.id_prospecto_actividad 
INNER JOIN familias_prospectos ON familias_prospectos.Id_familia_prospecto = prospectos.familia_prospecto_id 
INNER JOIN campus ON campus.id_camp = familias_prospectos.id_campus_familias_prospectos 
WHERE roles.nombre_rol LIKE '%CRM%' 
    AND campus.id_camp = 2 
GROUP BY (usuarios_login.id_login), prospectos.Id_prospecto 
ORDER BY usuarios.nombres_user ASC 

Sans voir vos données je ne fais une supposition: si vous voulez que le total par utilisateur, il suffit de retirer prospectos.Id_prospecto du GROUP BY si les données restent regroupées au niveau de l'utilisateur:

SELECT COUNT(*) AS TOTAL, 
    usuarios.nombres_user AS NOMBRE 
FROM usuarios 
INNER JOIN usuarios_login ON usuarios.id_user = usuarios_login.id_user 
INNER JOIN roles ON usuarios_login.id_rol_login = roles.id_rol 
INNER JOIN actividades ON actividades.usuario_actividad = usuarios_login.id_login 
INNER JOIN prospectos ON prospectos.Id_prospecto = actividades.id_prospecto_actividad 
INNER JOIN familias_prospectos ON familias_prospectos.Id_familia_prospecto = prospectos.familia_prospecto_id 
INNER JOIN campus ON campus.id_camp = familias_prospectos.id_campus_familias_prospectos 
WHERE roles.nombre_rol LIKE '%CRM%' 
    AND campus.id_camp = 2 
GROUP BY (usuarios_login.id_login) 
ORDER BY usuarios.nombres_user ASC 

Si cela ne fonctionne pas, vous pouvez simplement SUM les totaux avec une autre requête:

SELECT SUM(TOTAL), NOMBRE 
FROM 
( 
     SELECT COUNT(*) AS TOTAL, 
     usuarios.nombres_user AS NOMBRE 
    FROM usuarios 
    INNER JOIN usuarios_login ON usuarios.id_user = usuarios_login.id_user 
    INNER JOIN roles ON usuarios_login.id_rol_login = roles.id_rol 
    INNER JOIN actividades ON actividades.usuario_actividad = usuarios_login.id_login 
    INNER JOIN prospectos ON prospectos.Id_prospecto = actividades.id_prospecto_actividad 
    INNER JOIN familias_prospectos ON familias_prospectos.Id_familia_prospecto = prospectos.familia_prospecto_id 
    INNER JOIN campus ON campus.id_camp = familias_prospectos.id_campus_familias_prospectos 
    WHERE roles.nombre_rol LIKE '%CRM%' 
     AND campus.id_camp = 2 
    GROUP BY (usuarios_login.id_login), prospectos.Id_prospecto 
) T 
GROUP BY NOMBRE 
ORDER BY NOMBRE ASC 
+0

Merci. Mais cela ne fonctionne pas, l'erreur est la suivante: Chaque table dérivée doit avoir son propre alias dans MySQL. Le GROUP BY (usuarios_login.id_login), prospectos.Id_prospecto est très important pour moi pour de nombreuses raisons, et j'ai besoin de SUM les valeurs répétées. Merci encore. –