Bonjour,
(encore moi avec la même requête et plus ou moins le même problème, mais je ne savais pas si je devais rouvrir l'ancien ou faire un nouveau sujet... Comme le problème est plus précis, j'ai opté pour un nouveau sujet)
Donc rebelote :
J'ai trois tables :
Users,
Tickets
Groups
avec des tables intermédiaires pour chaque. J'aimerais compter le nombre tickets par utilisateur qui sont en attentes, par date de création.
Mais j'ai trop de réponses (trop de tickets).
J'ai la requête suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SELECT g.name AS groupname,
CONCAT_WS(' ', u.`firstname`, u.`name`) AS username, t.id,
sum(case when TO_DAYS(NOW()) - TO_DAYS(t.date)<3 then 1 else 0 end) AS `3days`,
sum(case when TO_DAYS(NOW()) - TO_DAYS(t.date)>=3 AND TO_DAYS(NOW()) - TO_DAYS(t.date)<7 then 1 else 0 end) AS `7days`,
sum(case when TO_DAYS(NOW()) - TO_DAYS(t.date)>=7 AND TO_DAYS(NOW()) - TO_DAYS(t.date)<14 then 1 else 0 end) AS `14days`,
sum(case when TO_DAYS(NOW()) - TO_DAYS(t.date)>=14 AND TO_DAYS(NOW()) - TO_DAYS(t.date)<30 then 1 else 0 end) AS `30days`,
sum(case when TO_DAYS(NOW()) - TO_DAYS(t.date)>=30 then 1 else 0 end) AS `more`
FROM users u
INNER JOIN tickets_users tu ON (tu.users_id=u.id AND tu.type='2')
INNER JOIN tickets t ON (t.id=tu.tickets_id)
LEFT JOIN groups_users gu ON (gu.users_id=u.id)
LEFT JOIN groups g ON (gu.groups_id=g.id)
WHERE t.status='4' group by CONCAT_WS(' ', u.`firstname`, u.`name`)
ORDER BY g.name DESC |
Seulement le problème, c'est qu'un utilisateur appartient parfois à plusieurs groupes... Or, je ne peux pas simplement supprimer cette jointure, car j'affiche un groupe.
Je n'ai pas besoin de savoir tous les groupes auquel il appartient, un seul me suffit (comme c'est déjà le cas à l'affichage).
Par contre, un ticket doit être compté une seule fois ! Et pour l'instant, il est compté autant de fois que l'utilisateur a de groupes.
Je ne sais pas si c'est bien clair =/
En tout cas, du coup, j'ai pensé à limiter l'utilisateur à un groupe au hasard, au niveau du Join du coup. Mais je n'y arrive pas.
J'ai testé :
LEFT JOIN groups g on (g.id=(Select Min(groups_id) from groups_users where users_id=u.id))
Mais ça ne change rien
et
1 2 3 4 5
| LEFT JOIN
(select * from (
select groups_id, row_number() over (partition by groups_id) AS rownum from groups_users
) where rownum=1
) groups_users gu on (gu.users_id=u.id) |
Mais j'ai l'erreur suivante :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(partition by groups_id) AS rownum from glpi_groups_users) where rownum=1) glpi' at line 11
Pour information j'ai MySQL 5.1.60
Merci =)
Partager