IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Limitation dans une jointure


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Limitation dans une jointure
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #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 =)

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    A première, vous pourriez résoudre le problème en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sum(case when TO_DAYS(NOW()) - TO_DAYS(t.date)<3 then 1 else 0 end) AS `3days`
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COUNT(DISTINCT case when TO_DAYS(NOW()) - TO_DAYS(t.date)<3 then t.id end) AS `3days`
    Mais il y a peut-être mieux. Avec la structure complète des tables sous forme de CREATE TABLE..., ce serait plus clair.

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Je ne sais pas si il y a mieux mais ça marche nickel !

    Après je peux pas mettre le create table (je ne l'ai tout simplement pas)
    Mais je peux faire ça :

    Ticket :
    • id
    • statut
    • date


    Ticket_Users :
    • id
    • users_id
    • tickets_id


    Users :
    • id
    • name
    • firstname


    Groups_Users:
    • id
    • users_id
    • groups_id


    Groups:
    • id
    • name

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par Chiyori Voir le message
    Après je peux pas mettre le create table (je ne l'ai tout simplement pas)
    Tu peux le récupérer en faisant SHOW CREATE TABLE ta_table;.

Discussions similaires

  1. Limiter le nombre de correspondance dans une jointure externe ?
    Par Hervé Saladin dans le forum Développement
    Réponses: 5
    Dernier message: 26/11/2010, 11h27
  2. erreur dans une jointure HQL
    Par Galak extra dans le forum Hibernate
    Réponses: 8
    Dernier message: 14/08/2006, 00h59
  3. [Conception] Tri des tables dans une jointure
    Par Tonio_35 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/07/2006, 15h05
  4. COUNT dans une jointure
    Par picsoun dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/04/2006, 20h27
  5. Ordre d'exécution dans une jointure externe
    Par Pero dans le forum Langage SQL
    Réponses: 17
    Dernier message: 20/09/2005, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo