MySQL : #1064 - Erreur de syntaxe près de

Résolu
stagiaire1 -  
Gigatrappeur Messages postés 230 Statut Membre -
Bonjour,

Je débute avec MySQL. J'utilise le module phpMyAdmin avec EasyPHP 12.1. Je souhaiterai récupérer les url des produits virtuels de table1 en connaissant seulement un idU.
Voici mes tables :


table 1

idP
name
is_virtual
url


table 2

idO_D
#idP
#idO


table 3

idO
#idU
is_delivered

Voici la requête que j'effectue :

SELECT url
FROM table1
INNER JOIN table2 ON table2.idP = table1.idP
INNER JOIN table3 ON table3.idO = table2.idO
WHERE table3.idU='1'
AND table3.is_delivered='0'
AND table1.is_virtual='1';

J'ai l'erreur "#1064 - Erreur de syntaxe près de 'order ON order.idO = order_detail.idO WHERE order.idU='1' AND order.is_delivered' à la ligne 4"

J'ai essayé une autre syntaxe :

SELECT P.url
FROM order O, order_detail OD, product P
WHERE O.idU ='1'
AND O.is_delivered='0'
AND O.idO=OD.idO OD.idP=P.idP
AND P.is_virtual='1';

Mais toujours une erreur : "#1064 - Erreur de syntaxe près de 'order O, order_detail OD, product P WHERE O.idU ='1' AND O.is_delivered='0' ' à la ligne 2"

Pourriez-vous m'éclairer?

Merci d'avance

7 réponses

  1. Gigatrappeur Messages postés 230 Statut Membre 25
     
    Bonjour,

    Envoie moi ton script de création de table + tes données de tests (CREATE TABLE + INSERT INTO) pour que je puisse regarder.

    Cordialement,
    Gigatrappeur
    1
  2. stagiaire_1 Messages postés 18 Statut Membre 8
     
    Je vous prie de m'excuser du temps de réponse, j'ai du me créer un compte sinon je ne pouvais pas poster de messages à cause du "titre du message non renseigné".

    Ce que je cherche à faire : J'ai un "user" avec un id que je connais qui souhaite visualiser ses produits virtuels (champ is_virtual de la table product) parmi les commandes qu'il a passé et qui n'ont pas été livrées (champ is_delivered de la table order).

    Voici le script de création, la table1 correspond à la table product, la table2 correspond à la table order_detail, la table3 correspond à la table order.

    --Structure de la table 'order'
    --

    CREATE TABLE IF NOT EXISTS 'order' (

    'idO' int(12) unsigned NOT NULL AUTO_INCREMENT,

    'idU' int(12) unsigned NOT NULL,

    'is_delivered' int(1) NOT NULL,

    PRIMARY KEY ('idO')
    )
    ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

    --
    -- Contenu de la table 'order'
    --

    INSERT INTO 'order' ('idO', 'idU', 'is_delivered') VALUES

    (1, 1, 0),

    (2, 1, 0);

    --
    -- Structure de la table 'order_detail'
    --

    CREATE TABLE IF NOT EXISTS 'order_detail' (

    'idO_D' int(11) unsigned NOT NULL AUTO_INCREMENT,

    'idO' int(11) unsigned NOT NULL,

    'idP' int(11) unsigned NOT NULL,

    PRIMARY KEY ('idO_D')
    )
    ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

    --
    -- Contenu de la table 'order_detail'
    --

    INSERT INTO 'order_detail' ('idO_D', 'idO', 'idP') VALUES

    (1, 1, 4),

    (2, 1, 2),

    (3, 2, 4),

    (4, 2, 5);

    --
    -- Structure de la table 'product'
    --

    CREATE TABLE IF NOT EXISTS 'product' (

    'idP' int(8) NOT NULL AUTO_INCREMENT,

    'name' varchar(32) NOT NULL,

    'is_virtual' int(1) NOT NULL,

    'url' varchar(255) NOT NULL,

    PRIMARY KEY ('idP')
    )
    ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

    --
    -- Contenu de la table 'product'
    --

    INSERT INTO 'product' ('idP', 'name', 'is_virtual', 'url') VALUES

    (1, 'Samsung Galaxy S3', 0, ''),
    (2, 'IPad mini', 0, ''),

    (3, 'Angry Birds', 1, ''),

    (4, 'Aptoide', 1, 'http://127.0.0.1/apps/Aptoide.apk'),

    (5, 'Talking tom cat 2', 1, 'http://127.0.0.1/apps/Talking_Tom_Cat_2_Free_1.2.1.apk');

    --
    -- Structure de la table 'user'
    --

    CREATE TABLE IF NOT EXISTS 'user' (

    'idU' int(11) NOT NULL AUTO_INCREMENT,

    'surname' varchar(32) NOT NULL,

    'name' varchar(32) NOT NULL,

    'pass' varchar(32) NOT NULL,

    'email' varchar(255) NOT NULL,

    'dateOfBirth' varchar(12) NOT NULL,

    PRIMARY KEY ('idU')
    )
    ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

    --
    -- Contenu de la table 'user'
    --

    INSERT INTO 'user' ('idU', 'surname', 'name', 'pass', 'email', 'dateOfBirth') VALUES

    (1, 'Jean', 'Jean', 'yop', 'jean@jean.fr', '06/06/1991');

    1
  3. Utilisateur anonyme
     
    Bonjour

    Mauvaise idée d'appeler ta table 'order'.
    À tous les coups c'est un mot réservé.
    Change le nom ou, si tu tiens absolument à le garder, entoure-le d'accents graves (Alt Gr 7)
    1
  4. Gigatrappeur Messages postés 230 Statut Membre 25
     
    Bonjour,

    En faite, "order" est un mot réservé. Il sert à ordonner les résultats d'un select.
    Tu ne peut donc pas l'utiliser en tant que nom de table.

    Voilà.

    Cordialement,
    Gigatrappeur
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. stagiaire_1 Messages postés 18 Statut Membre 8
     
    Merci beaucoup ça marche maintenant.

    Voici la requête que j'utilise :

    SELECT P.url
    FROM 'order' O, order_detail OD, product P
    WHERE O.idU = '1'
    AND O.is_delivered = '0'
    AND O.idO = OD.idO
    AND OD.idP = P.idP
    AND P.is_virtual = '1';

    J'aurais une autre petite question, par exemple cette requête me renvoi les lignes suivantes :
    http://img69.imageshack.us/img69/4738/resultwl.jpg

    Comment puis-je éviter les doublons ?

    Merci
    1
  7. Gigatrappeur Messages postés 230 Statut Membre 25
     
    Fais un select distinct :
    SELECT DISTINCT P.url 
    FROM ...
    


    Gigatrappeur
    1
  8. stagiaire_1 Messages postés 18 Statut Membre 8
     
    Super, merci beaucoup pour votre aide.
    1
    1. Gigatrappeur Messages postés 230 Statut Membre 25
       
      Peux-tu passer le sujet en résolu, si c'est le cas ? merci.
      0