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 :

Souci de requête select


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut Souci de requête select
    Bonjour !

    C'est mon premier message ici... j'ai trouvé votre forum en tapant "aide MySQL". ;-) Bravo pour ce forum d'entraide !

    J'essaie de faire une requête SELECT mais j'ai beaucoup de difficultés...

    Soit 3 tables :

    # annuaires qui contient ID_annuaire, url_annuaire, et actif (oui ou non)
    # sites qui contient ID_site
    # edoo qui contient ID_annuaire et ID_site

    A l'entrée de la requête, je connais la valeur ID_site, on va dire qu'il est égal à 21 dans notre cas.

    Ce que je veux, c'est sélectionner :

    - Un url_annuaire dont actif = oui dans la table annuaires (sélection au hasard)
    ... si et seulement si mon N° ID_site (21) ne se trouve PAS dans la table edoo pour l'ID_annuaire correspondant.

    Pour faire plus français, quand j'ai un ID_site, je veux lui assigner un "url_annuaire" qui ne lui a jamais encore été assigné d'une part, et qui est "actif" d'autre part.

    Bin ça parait simple comme ça mais je sèche dessus. La dernière quête que j'ai faite ne marche pas plus que les autres.

    J'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT annuaire.url_annuaire, annuaire.ID_annuaire, edoo.ID_annuaire
    FROM annuaires AS annuaire, edoo AS edoo
    WHERE annuaire.actif = 'oui'
    AND edoo.ID_site NOT
    IN (
     
    SELECT edoo.ID_annuaire
    FROM `edoo` AS edoo, `annuaires` AS annuaire
    WHERE edoo.ID_site = '21'
    AND edoo.ID_annuaire = annuaire.ID_annuaire
    )
    ORDER BY RAND( )
    LIMIT 1 ;
    Ca ne marche pas du tout. Là où cela cale, je pense que c'est avec le "edoo.ID_annuaire = annuaire.ID_annuaire" dans le NOT IN qui finalement, ne sert à rien du tout !

    Auriez-vous une idée de la façon de faire cela ? Pourriez-vous m'aider, s'il vous plaît ?

    A vous lire,

    Cerise.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut Précision
    J'oubliais de préciser le "ça ne marche pas du tout" : la requête ne produit pas d'erreur. Toutefois, sur quelques dizaines d'essais, je tombe forcément sur un url_annuaire qui se trouve bien dans la table "edoo" pour l'ID_site en question... alors que c'est ce que je ne souhaite pas !

    Merci et bonne soirée par avance,

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.url_annuaire, a.ID_annuaire
    FROM annuaires AS a
    INNER JOIN edoo AS e ON a.ID_annuaire =  e.ID_annuaire
    WHERE a.actif = 'oui'
    AND e.ID_site <> 21
    ORDER BY RAND( )
    LIMIT 1 ;
    Ah les jointures, ces bonnes vieilles jointures, elles simplifient tellement la vie du SQLeur !
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut Ca marche... presque ;-)
    Bonjour!

    Merci pour votre aide.

    Vous avez raison... il va falloir que je me mette aux jointures. ;-)

    J'ai testé via votre requête. Elle fonctionne. Toutefois, après plusieurs essais, je retrouve les mêmes résultats que précédemment.

    C'est à dire qu'il me sort parfois un résultat alors que le ID_site est présent dans edoo pour l'annuaire ID_annuaire...

    En y réfléchissant je viens de penser à quelque chose.... dans notre exemple, ID_site vaut 21.

    Mais dans la table edoo je peux avoir des occurrences pour lesquelles ID_site vaut 1, 4, 5, z. Plus encore, il peut même y avoir dans edoo des occurrences identiques de ID_annuaire pour des ID_site différents :

    ID_annuaire = x pour ID_site = 21 (celui de l'exemple)
    ID_annuaire = x pour ID_site = 34 (n'importe quel autre)
    etc...

    Je me dis que cela expliquerait peut-être le souci ? C'est à dire que via nos requêtes, en fait lorsqu'il y a plusieurs fois le même ID_annuaire pour différents ID_site, MySQL prend l'ID_annuaire x parce que parmi les résultats il y a bien un ID_site qui est différent de 21 ?

    Comment éviter ce souci ?

    En vous souhaitant une bonne soirée,

    Merci par avance,

    Cerise.

  5. #5
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    C'est un peu différent.
    Si on reformule ça en langage courant, tu veux extraire aleéatoirement de la table annuaire un unique tuplet {url_annuaire, ID_annuaire} pour lequel il n'existe pas de tuplet {ID_annuaire=x;ID_site=21} dans la table edoo.
    Ça tombe bien, SQL propose le couple d'opérateurs NOT EXISTS auquel il est aisé de fournir en paramètre une sous-requête corrélée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.url_annuaire, a.ID_annuaire
    FROM annuaires AS a
    WHERE a.actif = 'oui'
    AND NOT EXISTS (SELECT * FROM edoo AS e 
                                 WHERE a.ID_annuaire =  e.ID_annuaire
                                           AND e.ID_site = 21)
    ORDER BY RAND( )
    LIMIT 1 ;
    Tu comprends le principe ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut Un Grand Merci
    Bonjour Kris,

    Grand merci pour ton aide. Cela fonctionne parfaitement!

    Si je comprends bien la requête, elle demande tout a.url_annuaire, a.ID_annuaire lorsque celui si est actif dans annuaires et dont le ID_site "21" n'existe pas dans edoo pour cet annuaire.

    C'est brillant.

    J'ai du boulot : apprendre à faire des jointures et à utiliser le NOT EXISTS... des heures de jeu. :-)

    Merci à toi pour ton aide et pour ton temps....

  7. #7
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par CeriseG Voir le message
    Si je comprends bien la requête, elle demande tout a.url_annuaire, a.ID_annuaire lorsque celui si est actif dans annuaires et dont le ID_site "21" n'existe pas dans edoo pour cet annuaire.

    C'est brillant.
    Honnêtement, non, c'est assez bê-bête et basique.
    La corrélation se fait effectivement sur ID_annuaire entre les deux tables.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  2. C'est possible dans une requête SELECT ?
    Par Kokito dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/04/2005, 16h59
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. SQL Server 7.0 - Requête Select
    Par sangokus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/03/2004, 10h32
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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