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 :

Bug sur requête avec FULL OUTER JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut Bug sur requête avec FULL OUTER JOIN
    bonjour
    je ne comprends pas pourquoi j'ai une erreur de syntaxe sur FULL OUTER JOIN
    voici ma requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from products p left join products_description pd on p.products_id=pd.products_id FULL OUTER JOIN specials s on s.products_id=pd.products_id where (p.products_model_f REGEXP '(ral_|ral-)') and (p.codeF !=2 and p.codeF !=11 and p.codeF !=12 and p.codeF !=13) group by p.products_id order by p.products_model
    et voici l'erreur
    1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN specials s on s.products_id=pd.products_id where (p.products_mo' at line 1
    merci pour votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Scindez la requête en petits morceaux pour identifier là ou ça coince : d'abord une jointure, puis l'autre, puis ajouter le where...

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    FULL OUTER JOIN n'existe pas en mysql, il faut décomposer en 2 requêtes unies via UNION ALL.
    Par ailleurs, un GROUP BY associé à un SELECT * ne fera pas bon ménage, il faut supprimer le GROUP BY.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Par ailleurs, un GROUP BY associé à un SELECT * ne fera pas bon ménage, il faut supprimer le GROUP BY.
    pourquoi celà .

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Oui, en effet, Skuatamad a raison, le FULL JOIN n'existe pas sous MySql.
    Mais qu'à cela tienne, on peut le simuler en faisant un UNION entre un LEFT OUTER JOIN et un RIGHT OUTER JOIN comme dans l'exemple ci-après :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    --------------
    select *
    from      `ecrivains` as tb1
    FULL JOIN `livres`    as tb2
    --------------
     
    ERROR 1064 (42000) at line 9: Erreur de syntaxe près de 'FULL JOIN `livres`    as tb2' à la ligne 3
    --------------
    SELECT *
    from             `ecrivains` as tb1
    LEFT  OUTER JOIN `livres`    as tb2
    ON  tb1.clef = tb2.clef
     
    UNION
     
    SELECT *
    from             `ecrivains` as tb1
    RIGHT OUTER JOIN `livres`    as tb2
    ON  tb1.clef = tb2.clef
    --------------
     
    +------+------------+-----------+------------+----------------------+------------+--------------+------+------------------------+----------+---------+--------+
    | clef | nom        | prenom    | naissance  | lieu                 | mort       | repos        | clef | titre                  | parution | genre   | prix   |
    +------+------------+-----------+------------+----------------------+------------+--------------+------+------------------------+----------+---------+--------+
    | Bal  | Balzac     | Honoré    | 1799-05-20 | Tours                | 1850-08-18 | Paris        | Bal  | Le Père Goriot         | 1834     | Roman   |   0.00 |
    | Bal  | Balzac     | Honoré    | 1799-05-20 | Tours                | 1850-08-18 | Paris        | Bal  | Eugénie Grandet        | 1833     | Roman   | 100.00 |
    | Duf  | Dumas Fils | Alexandre | 1824-07-27 | Paris                | 1895-11-27 | Marly-le-Roi | Duf  | La Dame Aux Camélias   | 1852     | Théatre | 110.00 |
    | Dup  | Dumas Père | Alexandre | 1802-07-24 | Villiers-Cotterêts   | 1870-12-05 | Puys         | Dup  | Vingt ans après        | 1845     | Roman   |  80.00 |
    | Dup  | Dumas Père | Alexandre | 1802-07-24 | Villiers-Cotterêts   | 1870-12-05 | Puys         | Dup  | Les Trois Mousquetaire | 1844     | Roman   |  80.00 |
    | Fla  | Flaubert   | Gustave   | 1821-12-12 | Rouen                | 1880-05-08 | Croisset     | Fla  | Madame Bovary          | 1857     | Roman   |  99.50 |
    | Hug  | Hugo       | Victor    | 1802-01-26 | Besancon             | 1885-05-22 | Paris        | Hug  | Les Misérables         | 1862     | Roman   | 148.50 |
    | Hug  | Hugo       | Victor    | 1802-01-26 | Besancon             | 1885-05-22 | Paris        | Hug  | Les Contemplations     | 1856     | Poésie  |  78.50 |
    | Hug  | Hugo       | Victor    | 1802-01-26 | Besancon             | 1885-05-22 | Paris        | Hug  | Hernani                | 1830     | Théatre | 120.00 |
    | Rim  | Rimbaud    | Arthur    | 1854-10-20 | Charleville-Mézières | 1891-11-10 | Marseille    | NULL | NULL                   | NULL     | NULL    |   NULL |
    | San  | Sand       | George    | 1804-07-01 | Paris                | 1876-06-08 | Nohant-Vic   | NULL | NULL                   | NULL     | NULL    |   NULL |
    | Ver  | Verlaine   | Paul      | 1844-03-30 | NULL                 | 1896-01-08 | Paris        | Ver  | Poèmes Saturniens      | 1866     | Poésie  |  90.50 |
    | Zol  | Zola       | Emile     | 1840-04-02 | Paris                | 1902-09-29 | Paris        | NULL | NULL                   | NULL     | NULL    |   NULL |
    | NULL | NULL       | NULL      | NULL       | NULL                 | NULL       | NULL         | Ste  | Le Rouge et le Noir    | 1831     | Roman   |  98.50 |
    | NULL | NULL       | NULL      | NULL       | NULL                 | NULL       | NULL         | Ste  | La Chartreuse de Parme | 1839     | Roman   | 110.50 |
    +------+------------+-----------+------------+----------------------+------------+--------------+------+------------------------+----------+---------+--------+
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    pourquoi celà .
    Pour éviter d'avoir des résultats aléatoires :
    http://cedric-duprez.developpez.com/...r-group-by/#L3

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut skuatamad.

    Il n'y a pas de comportement aléatoire, il y a juste que la requête est mal écrite.
    Si l'on désire récupérer une ligne ayant par exemple la plus grande date, on procède ainsi :
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  clef,
            date
      from  test as t1
     where  date = ( select  max(date)
                       from  test as t2
                      where  t2.clef = t1.clef
                   );
    Dans cet exemple, il st inutile de faire un group by parce que la clause where va en principe récupérer une seule ligne, en admettant qu'il existe une seule date maximale.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    intéressant Artemus24.merci pour l'astuce

Discussions similaires

  1. [AC-2013] Requête sur 3 tables avec Full outer join
    Par Bireli dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/10/2015, 08h45
  2. Aide sur une requête LINQ avec left outer join
    Par jbrasselet dans le forum Linq
    Réponses: 5
    Dernier message: 12/09/2011, 09h31
  3. [DML]Fusion de deux requêtes full Outer join colonne null
    Par peuplier dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/01/2009, 15h22
  4. Réponses: 3
    Dernier message: 19/02/2008, 10h26

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