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

Langage SQL Discussion :

INNER JOIN ne fonctionne pas dans ma requête SQL


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut INNER JOIN ne fonctionne pas dans ma requête SQL
    Bonjour,

    C'est pour une requête SQL pour une bas MYSQL (avec PHP).
    J'ai un peu du mal avec cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T1.* 
    FROM `gest_dev_taches` AS T1 
    WHERE EXISTS (
      SELECT 1 
      FROM `gest_dev_taches` AS T2 
      WHERE T1.tac_intitule = T2.tac_intitule 
      HAVING T1.`tac_crea_date` = max(T2.tac_crea_date)
    ) AND (`tac_val`='O' OR `tac_val`='N') 
    ORDER BY `tac_progression`
    Celle-ci fonctionne bien.
    Mais lorsque je veux faire un INNER JOIN dessus, bin ça marche plus.
    J'dois faire un truc qui marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT T1.* 
    FROM `gest_dev_taches` AS T1 
    INNER JOIN `gest_param_users` 
      ON T1.tac_crea_user = gest_param_users.user_id 
    WHERE EXISTS (
      SELECT 1 
      FROM `gest_dev_taches` AS T2 
      WHERE T1.tac_intitule = T2.tac_intitule 
      HAVING T1.`tac_crea_date` = max(T2.tac_crea_date)
    ) AND (`tac_val`='O' OR `tac_val`='N') 
    ORDER BY `tac_progression`
    Ça doit être tout con... quelqu'un peut-il m'aider ?
    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,
    Qu'est ce qui ne marche pas? un message d'erreur? ou les données correspondent plus à ce que vous voulez?

  3. #3
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    Rien. Aucune donnée. Aucun message d'erreur. Aucun résultat. L'angoisse du vide . Sans le INNER JOIN, tout va bien. Mais avec, c'est le vide interstellaire.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    A quoi est censé servir cet INNER JOIN vu qu'on ne ramène pas les données de la table jointe et qu'il n'y a pas non plus de restriction sur les données de cette table ?

  5. #5
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    Heu justement je souhaite ramener les données (je suis super nul en SQL) de la table jointe, c'est bien mon propos. Et je n'ai pas bien compris l'histoire des restrictions... merci.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Salut,
    le plus simple serait que tu nous décrive tes tables, eventuellement avec un jeu de données, et que tu nous explique clairement ce que t'aimerais en sortir, parce que la je suis pas sûr de bien comprendre ce que tu cherches

  7. #7
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    ok je comprends bien.

    Donc pour la première requête :
    Une seule table gest_dev_taches.
    Les noms de colonnes principales : tac_id,tac_crea_date,tac_crea_user,tac_intitule,tac_progression
    Ce que je veux (et cette première requête fonctionne), c'est afficher chaque tâche la plus récente (tac_crea_date) et ne pas afficher les plus anciennes lorsque tac_intitule est le même.
    Voilà j'espère que c'est clair, c'est pas évident à décrire.

    Pour la deuxième requête, je veux la même chose mais en plus afficher le nom et prénom de la personne qui a créé cette tâche. Donc relier gest_dev_taches avec gest_param_users par tac_crea_user et user_id.
    Et là, plum, ça ne marche pas...

    Merci

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si ta première requete fonctionne bien, j'imagine que c'est la condition de jointure entre tes deux tables qui n'est jamais vérifiée. J'imagine que tes champs nom et prenom proviennent de T2 puisque la jointure a pour but de recupérer ces deux champs.
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT T1.*, T2.nom, T2.prenom 
    FROM `gest_dev_taches` AS T1 
    LEFT JOIN `gest_param_users` 
      ON T1.tac_crea_user = gest_param_users.user_id
    WHERE EXISTS (
      SELECT 1 
      FROM `gest_dev_taches` AS T2 
      WHERE T1.tac_intitule = T2.tac_intitule 
      HAVING T1.`tac_crea_date` = max(T2.tac_crea_date)
    ) AND (`tac_val`='O' OR `tac_val`='N') 
    ORDER BY `tac_progression`
    La jointure externe entre T1 et T2 (T1 left join T2) te renverra les resultats de T1 même s'il n'y a pas d'enregistrement dans T2 vérifiant les conditions de jointure. Si le join simple ne te renvoie rien, j'imagine que les champs nom et prenom de cette requete seront toujours NULL. Après, à toi de voir pourquoi la condition "T1.tac_crea_user = gest_param_users.user_id" n'est jamais vérifiée, ou de nous fournir le DLL de tes tables avec un jeu de données.

  9. #9
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    Non les champs nom (user_nom) et prénom (user_prenom) ne proviennent pas de T2 (extrait : FROM `gest_dev_taches` AS T2).
    Ils sont à extraire de l'autre table `gest_param_users` (par la jointure).

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kryogen Voir le message
    table gest_dev_taches(tac_id,tac_crea_date,tac_crea_user,tac_intitule,tac_progression)

    afficher chaque tâche la plus récente (tac_crea_date) et ne pas afficher les plus anciennes lorsque tac_intitule est le même.
    Voilà j'espère que c'est clair, c'est pas évident à décrire.
    Euh... pas vraiment clair non !
    J'en déduis qu'il y a plusieurs fois un même tac_id dans la table ?
    Il faut donc grouper par tac_id et rechercher la tac_crea_date la plus récente pour chaque tac_id ? C'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tac_id, MAX(tac_crea_date) AS DateMax
    FROM gest_dev_taches
    GROUP BY tac_id
    Si tu veux les autres infos de la tâche alors il faut joindre la table avec le résultat de la requête ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.tac_id, t1.tac_crea_user, t1.tac_intitule, t1.tac_progression
    FROM gest_dev_taches t1
    INNER JOIN (
      SELECT tac_id, MAX(tac_crea_date) AS DateMax
      FROM gest_dev_taches
      GROUP BY tac_id
    ) t2 ON t1.tac_id = t2.tac_id
    WHERE t1.tac_crea_date = t2.DateMax
    Pour la deuxième requête, je veux la même chose mais en plus afficher le nom et prénom de la personne qui a créé cette tâche. Donc relier gest_dev_taches avec gest_param_users par tac_crea_user et user_id.
    Nouvelle jointure avec la table gest_param_users effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t1.tac_id, t1.tac_crea_user, u.user_nom, t1.tac_intitule, t1.tac_progression
    FROM gest_dev_taches t1
    INNER JOIN (
      SELECT tac_id, MAX(tac_crea_date) AS DateMax
      FROM gest_dev_taches
      GROUP BY tac_id
    ) t2 ON t1.tac_id = t2.tac_id
    INNER JOIN gest_param_users u ON t1.tac_crea_user = u.user_id
    WHERE t1.tac_crea_date = t2.DateMax

  11. #11
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    yep désolé.
    non en fait les tac_id sont tous différents (clé primaire), il y a plusieurs tac_intitule identiques dans la table.
    Bon je vais essayer de m'en débrouiller avec tes requêtes, ça m'a l'air pas mal.
    Merci.

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ben alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t1.tac_id, t1.tac_crea_user, u.user_nom, t1.tac_intitule, t1.tac_progression
    FROM gest_dev_taches t1
    INNER JOIN (
      SELECT tac_intitule, MAX(tac_crea_date) AS DateMax
      FROM gest_dev_taches
      GROUP BY tac_intitule
    ) t2 ON t1.tac_intitule = t2.tac_intitule
    INNER JOIN gest_param_users u ON t1.tac_crea_user = u.user_id
    WHERE t1.tac_crea_date = t2.DateMax

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par kryogen Voir le message
    Non les champs nom (user_nom) et prénom (user_prenom) ne proviennent pas de T2 (extrait : FROM `gest_dev_taches` AS T2).
    Ils sont à extraire de l'autre table `gest_param_users` (par la jointure).
    Au temps pour moi, je me suis embrouillé avec les noms, faut remplacer T2 par `gest_param_users` dans mon post

  14. #14
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    Merci c'est super !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] fonctions Droite et Gauche qui ne fonctionnent pas dans une requête
    Par samy35 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/03/2014, 10h14
  2. Mon UNION ne fonctionne pas dans ma requête ?
    Par wwwbillgates dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/12/2010, 15h48
  3. Réponses: 3
    Dernier message: 12/12/2008, 08h05
  4. "Inner Join" ne fonctionne pas!
    Par amtdev dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/06/2006, 23h12
  5. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46

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