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 :

Requête SELECT contraintes sur plusieurs lignes


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 89
    Points : 56
    Points
    56
    Par défaut Requête SELECT contraintes sur plusieurs lignes
    Bonjour,

    J'aimerais sélectionner le "SID" de cette table qui correspond à la phrase "I am mad" (donc seulement ces mots et dans cet ordre la), est ce possible de faire cela en 1 seule requête SELECT ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SID	WORD   ORDER
    1	I	   1
    1	am	   2
    1	mad	   3
    2	You	   1
    2	are	   2
    3	I	   1
    3	am	   2
    3	mad	   3
    3	too	   4
    Merci !

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour,

    La table et le jeu d'essais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE mots (
     sid integer,
     word varchar(20),
     ordre integer);
    insert into mots values (1, 'I', 1);
    insert into mots values (1, 'am', 2);
    insert into mots values (1, 'mad', 3);
    insert into mots values (2, 'You', 1);
    insert into mots values (2, 'are', 2);
    insert into mots values (3, 'I', 1);
    insert into mots values (3, 'am', 2);
    insert into mots values (3, 'mad', 3);
    insert into mots values (3, 'too', 4);
    Essayez ceci:
    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 sid
    FROM (
    	SELECT sid FROM mots WHERE word = 'I'
    	UNION ALL
    	SELECT sid FROM mots WHERE word = 'am'
    	UNION ALL
    	SELECT sid FROM mots WHERE word = 'mad'
    ) AS td1
    	NATURAL JOIN (
    		SELECT Count(*) AS nbMots, sid
    		FROM mots
    		GROUP BY sid
    	) AS td2
    WHERE nbMots = 3
    Il faut mettre dans la première table dérivée autant de requêtes avec UNION qu'il y a de mots à chercher.
    Il faut mettre le nombre de mots de la phrase que l'on cherche dans la clause WHERE (ici 3).

    Résultat:
    Je n'ai pas géré l'ordre des mots.

  3. #3
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Voici une nouvelle version utilisant la fonction GROUP_CONCAT() de MySQL, celle-ci devrait gérer le nombre et l'ordre des mots dans la phrase.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    SELECT td1.sid
    FROM (
       SELECT sid, CAST(GROUP_CONCAT(ordre ORDER BY ordre ASC) AS CHAR) AS ordre
       FROM (
          SELECT sid, ordre FROM mots WHERE word = 'I'
          UNION ALL
          SELECT sid, ordre FROM mots WHERE word = 'am'
          UNION ALL
          SELECT sid, ordre FROM mots WHERE word = 'mad'
       ) AS recherche
       GROUP BY sid
    ) AS td1
       JOIN (
          SELECT sid, CAST(GROUP_CONCAT(ordre ORDER BY ordre ASC) AS CHAR) AS ordre
          FROM mots
          GROUP BY sid
       ) AS td2
          ON td1.sid = td2.sid
          AND td1.ordre = td2.ordre
    Résultat:

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Merci beaucoup pour ton aide !!

    Je vais tester ca tout de suite !

    Ça fonctionne parfaitement ! Par contre comment faire si au lieu des mots j'ai des id qui corresponde aux mots dans une autre table ?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    table mesmots
     
    ID	MOT
    1	I
    2	am
    3	mad
    etc

Discussions similaires

  1. Requête de jointure sur plusieurs ligne
    Par thelover2fr dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/05/2012, 13h35
  2. Ecriture requête sur plusieurs lignes
    Par michon dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/04/2011, 08h56
  3. select sur plusieurs lignes
    Par lcaya dans le forum SQL
    Réponses: 1
    Dernier message: 03/11/2009, 11h43
  4. Réponses: 4
    Dernier message: 29/08/2008, 14h21
  5. Pb de requète selection TOP sur plusieurs champs
    Par schnock dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/05/2008, 20h12

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