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

PHP & Base de données Discussion :

Requête sql imbriquée


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Points : 92
    Points
    92
    Par défaut Requête sql imbriquée
    Bonsoir,

    J'ai un problème dans la conception d'une requête, et j'aurais besoin de vous.

    Le but, je recherche dans ma table1, champs nom, le mot matsuyama
    Pas de problème. Par contre, je voudrais également chercher dans la table2, champs tag, ce même mot. Or, il n'y est pas mais je voudrais tout de même afficher la ligne de la table1 et je bloque.

    Ensuite, deuxième cas, je recherche dans ma table1, champs nom, le mot japonais qui n'y figure pas mais également dans ma table2, champs tag qui lui y est bien. Je voudrais donc afficher la ligne de la table1 qui est lié à la table 2 par l'id.

    Pas facile à expliquer, j'espère que vous m'avez compris lol

    Merci

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Points : 77
    Points
    77
    Par défaut
    bn pr le premier cas enregistre le resultat de la premiere requete dans une variable affiche la ensuite
    si tu pouvais mettre le code ça serait mieu

  3. #3
    Membre régulier Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Points : 92
    Points
    92
    Par défaut
    Exemple

    Table1 -> champs nom = matsuyama | id = 3931
    Table2 -> champs tag = japonais | id = 3931
    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE Table2.tag like '%japonais%' or Table1.nom like '% japonais%' and Table1.id = Table2.id
    Ca me renvoie toute ma base de données, donc il y a un problème :s
    Merci

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par PIEPLU Voir le message
    Exemple



    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE Table2.tag like '%japonais%' or Table1.nom like '% japonais%' and Table1.id = Table2.id
    Ca me renvoie toute ma base de données, donc il y a un problème :s
    Merci
    bon je te donne deux solutions essaie et utilise celle que tu preferes:

    Solution 1: une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE (Table2.tag like 'japonais' or Table1.nom like ' japonais') and Table1.id = Table2.id
    Solution 2:
    2 requête et un test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $res1=mysql_query("SELECT id, nom FROM Table1 WHERE nom LIKE 'japonais'");
    $res2=mysql_query("SELECT id, tag FROM Table 2 WHERE tag LIKE 'japonais'");
    while($r1=mysql_fetch_array($res1) OR $r2=mysql_fetch_array($res2))
    {
               if($r1['id'] == $r2['id'])
               {
                          ton traitement la;
               }
    }

  5. #5
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Citation Envoyé par ridick Voir le message
    bon je te donne deux solutions essaie et utilise celle que tu preferes:

    Solution 1: une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE (Table2.tag like 'japonais' or Table1.nom like ' japonais') and Table1.id = Table2.id
    Solution 2:
    2 requête et un test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $res1=mysql_query("SELECT id, nom FROM Table1 WHERE nom LIKE 'japonais'");
    $res2=mysql_query("SELECT id, tag FROM Table 2 WHERE tag LIKE 'japonais'");
    while($r1=mysql_fetch_array($res1) OR $r2=mysql_fetch_array($res2))
    {
               if($r1['id'] == $r2['id'])
               {
                          ton traitement la;
               }
    }

    Euh... Pour la première solution utiliser des LIKE sans % ça sert pas à grand chose, ça revient à faire un = (à moins qu'il y ait une raison que j'ignore ???). Quand à la deuxième solution... Euh...


    Pour Pieplu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE Table2.tag like '%japonais%' or Table1.nom like '% japonais%' and Table1.id = Table2.id
    Tu dois avoir un souci de priorité dans tes conditions, le AND étant prioritaire par rapport au OR.
    Essaie en parenthèsant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE (Table2.tag like '%japonais%' or Table1.nom like '%japonais%') and Table1.id = Table2.id
    Enfin après ça dépend de ce que tu veux obtenir par rapport à ce que tu as en BDD.

  6. #6
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Amara Voir le message

    Euh... Pour la première solution utiliser des LIKE sans % ça sert pas à grand chose, ça revient à faire un = (à moins qu'il y ait une raison que j'ignore ???). Quand à la deuxième solution... Euh...


    Pour Pieplu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE Table2.tag like '%japonais%' or Table1.nom like '% japonais%' and Table1.id = Table2.id
    Tu dois avoir un souci de priorité dans tes conditions, le AND étant prioritaire par rapport au OR.
    Essaie en parenthèsant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.id,Table1.nom,Table2.id,Table2.tag FROM Table1, Table2 WHERE (Table2.tag like '%japonais%' or Table1.nom like '%japonais%') and Table1.id = Table2.id
    Enfin après ça dépend de ce que tu veux obtenir par rapport à ce que tu as en BDD.
    c'est ce qui est demandé : le mot japonais mais c'est plus propre de mettre LIKE pour des chaines de caractères et des dates si on veut coder en respectant les normes bien sur pour ta 2eme solution c'est la meme que la mienne :d

  7. #7
    Membre régulier Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Points : 92
    Points
    92
    Par défaut
    Bon, j'ai donc mis avec mes noms de tables et de champs, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Entreprises.id_entreprise,Entreprises.nom_entreprise,Tags.id_entreprise,Tags.tag FROM Entreprises, Tags WHERE (Tags.tag like '%Matsuyama%' or Entreprises.nom_entreprise like '%Matsuyama%') and Entreprises.id_entreprise = Tags.id_entreprise
    Quand "Matsuyama" ou un autre terme est dans la table Tags, cela fonctionne bien. Dès lors que je vide tags, il renvoie plus rien avec que dans Entreprises, j'ai bien nom_entreprise = Matsuyama

    C'est ici que je bloque.

    Merci

  8. #8
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par PIEPLU Voir le message
    Bon, j'ai donc mis avec mes noms de tables et de champs, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Entreprises.id_entreprise,Entreprises.nom_entreprise,Tags.id_entreprise,Tags.tag FROM Entreprises, Tags WHERE (Tags.tag like '%Matsuyama%' or Entreprises.nom_entreprise like '%Matsuyama%') and Entreprises.id_entreprise = Tags.id_entreprise
    Quand "Matsuyama" ou un autre terme est dans la table Tags, cela fonctionne bien. Dès lors que je vide tags, il renvoie plus rien avec que dans Entreprises, j'ai bien nom_entreprise = Matsuyama

    C'est ici que je bloque.


    quand tu vide tags tu n'as plus d'entrées dans tags c'est ça?
    dans ce cas tu n'auras plus d'egalité pour le id_entreprise et normalement ça doit rien envoyé
    Merci

  9. #9
    Membre régulier Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Points : 92
    Points
    92
    Par défaut
    Mais ce n'est pas ce que je recherche.

    si je cherche matsuyama, je veux ressortir la ligne de Entreprises sans tag vu qu'il y en a pas d'associé dans la table Tags

    Ensuite, si dans Tags il y a japonais avec l'id_entreprise, je veux ressortir l'id_entreprise de Entreprises

    Pas simple

  10. #10
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Points : 77
    Points
    77
    Par défaut
    explique ce que tu veux que la requête fasse au juste

  11. #11
    Membre régulier Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Points : 92
    Points
    92
    Par défaut
    J'ai déjà expliquer plusieurs fois au dessus

  12. #12
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    pour faire ça tu as besoin de jointure externe, regarde là :
    http://sqlpro.developpez.com/cours/s...ntures/#LIII-C

  13. #13
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Tu peux faire aussi une union de deux requête avec la première qui ne s'occupe que du cas des noms qui correspondent à ta demande (genre un SELECT nom FROM Entreprises WHERE taRecherche) et la deuxième qui rapporte les noms mais avec votre requête du debut mais simplifié genre
    (SELECT table2.nom FROM les deux tables WHERE idTable1= idTable2 AND la condition sur le nom)

    J'ai simplifié, mais l'avantage de l'union est que si dans 1 mais pas 2 ya affichage et si dans 2 mais pas 1, de même ....

    C ce que tu voulais non ?

    Edit: j'ai lu rapidement le Post, mais il ya un inconvénient si le 'japonais' se trouve dans les deux tables, y aura deux fois la réponse

Discussions similaires

  1. [Toutes versions] Requète SQL imbriqué
    Par Maxpuff dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/05/2010, 16h46
  2. Requêtes SQL imbriquées
    Par zpliz dans le forum SQL
    Réponses: 5
    Dernier message: 25/03/2010, 09h58
  3. Requête SQL imbriqué, 3 tables, plusieurs colonnes
    Par opacho dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/07/2009, 09h45
  4. Requête SQL imbriquée
    Par cecile15 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/05/2009, 10h39
  5. Requête SQL imbriquées
    Par Fanette85 dans le forum ASP.NET
    Réponses: 20
    Dernier message: 05/10/2007, 14h12

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