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 :

Récuperer différence entre deux tables avec JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut Récuperer différence entre deux tables avec JOIN
    Bonjour,

    Je développe actuellement un site web traitant de jeux video avec cakephp. Sur ce site j'ai deux tables, une s'appelant "articles" qui contient des articles de tout type(news,test,..) et une autre table qui s'appelle "tests". Entre les deux la relation est la suivante: un article peut être aucun ou un seul test, et un test est un article au min et au max. Cette dernière table contient la clef étrangère vers un article, une clef primaire auto-incrementé et quelques champs.

    Je considère que quand un article n'a pas son id présent dans la table test ce n'est pas un test. Et justement je voudrais pouvoir arriver à faire cette différence avec une requête SQL. Voulant utiliser les outils mis à ma disposition par cakephp afin de faire ma jointure je dispose de LEFT, RIGHT, INNER,....JOIN.
    Je voudrais dans ma requête pouvoir récupérer les articles qui n'ont pas leur id dans la table test. Et j'ai beau avoir tenté plusieurs essais je n'y arrive pas. A chaque fois soit je récupère que les articles qui sont des tests, soit il me multiplie le nombre d'article par le nombre de test (c'est un calcul matriciel si je ne me trompe pas?).

    Voila un exemple de requete que j'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Article.id,Article.titre,Article.date_parution 
    FROM `articles` AS `Article` 
    LEFT JOIN `games` AS `Game` ON (`Article`.`game_id` = `Game`.`id`) 
    INNER JOIN `tests` AS `Test` ON (`Test`.`article_id` != `Article`.`id`) 
    WHERE `Game`.`id` = 9
    La table game contient des infos sur des jeux, et elle est relié à articles (un articles traite d'un jeu ou aucun).

    Je vous remercie d'avance pour votre aide

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Ton problème vient du fait que tu compliques un peu d'emblée la requête par 2 jointures.
    Voici la requête qui devrait te donner la liste des articles qui ne sont pas des tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Article.id,Article.titre,Article.date_parution 
    FROM `articles` AS Article
    LEFT JOIN `tests` AS Test ON (Test.`article_id` != Article.`id`)
    Maintenant, visiblement, tu souhaites restreindre le résultat à un jeu ?

    ced

  3. #3
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Cela ne fonctionne pas. Je trouve cela vraiment étrange. La requête est censé être bonne. En faite je me retrouve avec le nombre d'articles * le nombre de test, excepté pour les articles qui sont des test où eux sont le nombre d'articles * le nombre de test -1. Même si éventuellement je mettais un distinct je me retrouverais encore avec les articles qui sont des tests.

    D'abord il me semble possible de pouvoir y arriver sans distinct. Sinon oui après je souhaite restreindre à un seul jeu. L'id du jeu se trouve en clef étrangère dans la table articles.

    Sinon le fait de vouloir faire cette requête avec LEFT,RIGHT,... Tiens au faite que je désire utiliser l'ORM de cakephp pour faire mes requêtes.

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Article.id,Article.titre,Article.date_parution 
    FROM articles AS Article
    LEFT JOIN tests AS Test ON Test.article_id = Article.id
    where Test.article_id is NULL

  5. #5
    Membre du Club Avatar de Takumi
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 163
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Cela marche nickel avec ta requête. Mais je trouve ça quand même dommage de devoir mettre la conditions après le where. Je pensais trouver un truc encore plus simple juste en mettant la bonne condition après le ON.

    Enfin bon, tant que ça marche.

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    après ce qui peux fonctionner,c'est l'utilisation d'un 'NOT IN'
    mais je pense que le plus efficace est la solution donnée.

    au départ la solution présentée retournée une ligne dès qu'elle trouvait un id article différent d'un id test. Autant dire qu'elle en trouvait beaucoup pour chaque article!

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Arrrgh !
    Au temps pour moi, j'ai copié trop vite ta première requête...

    Désolé

    ced

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

Discussions similaires

  1. Différence entre deux tables
    Par fabricedallara dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 24/05/2012, 14h31
  2. MINUS et Différence entre deux tables
    Par thegreatbato dans le forum SQL
    Réponses: 19
    Dernier message: 27/03/2008, 17h16
  3. Afficher la différence entre deux tables
    Par MartinezGarcia dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/02/2008, 20h25
  4. Différence entre deux tables
    Par szoubir dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 24/07/2007, 18h41
  5. faire une différence entre deux tables
    Par geay dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/09/2006, 15h33

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