Forum Programmation.php Mysql requete In

Posté par  .
Étiquettes : aucune
0
18
mai
2005
Salut bon juste un petite question, je veux faire une requete du genre select truc from bidule where truc2 IN (select truc2 from bidule2 where...)

Mon pb est que j'ai une erreur et que je ne l'a comprends pas alors voila mon code + erreur mysql :

SELECT nom
FROM table1
WHERE prenom = 'TOTO' AND id
IN (
SELECT id
FROM table2
WHERE entreid = '13'
) LIMIT 0, 30

MySQL a répondu:
#1064 - You have an error in your SQL syntax near 'SELECT id
FROM table2
WHERE entreid = '13 ' ) LIMIT 0, 30' at line 5

Merci à tous !
  • # requetes imbriquées

    Posté par  . Évalué à 4.

    MySQL ne gere pas les requêtes imbriquées dans les versions inferrieures à 4.1 (il me semble, à vérifier)

    Dam
  • # Sous-Select not supported

    Posté par  . Évalué à 3.

    Mmmmm.... à vue de nez comme ça, je dirais que MySQL ne supporte pas les sous-select. Je crois que ça va bientôt le faire (peut être déjà...). Vérifie le numéro de ta version.
    • [^] # Re: Sous-Select not supported

      Posté par  . Évalué à 2.

      Arg !
      Comment faire alors pour avoir le même rendu, par exemple pour la requete du dessus ???

      A L'AIDE :S
      • [^] # Re: Sous-Select not supported

        Posté par  . Évalué à 3.

        Tu fais deux requêtes en PHP...

        - "SELECT id FROM table2 WHERE entreid = '13'"

        Tu récupères les résultats, et tu construits dynamiquement la seconde requêtes :

        - "SELECT nom FROM table1 WHERE prenom = 'TOTO' AND id IN ($blablabla) LIMIT 0, 30"

        Je te laisse traiter les cas particuliers ou la 1ère requête ne retourne rien à titre d'exercice :)
  • # Je crois que

    Posté par  . Évalué à -1.

    Je crois que meme sous les versions recentes de mysql les requettes imbriquées ne gerent que mal les LIMIT.

    par contre sous postgres là oui cette requette serait surement valide sans modification.
  • # EXISTS

    Posté par  . Évalué à 1.

    MySQL ne supporte pas les requêtes imbriquées, mais la clause EXISTS semble être faite pour ça.
    http://www.nexen.net/docs/mysql/annotee/exists-and-not-exists-subqu(...)
  • # jointure

    Posté par  . Évalué à 2.

    je ne connais pas le mot clef LIMIT (je suis pas très fort en spécifique mysql) mais je réécrirais bien ta requête en

    select nom
    from table1, table2
    where table1.prenom = 'TOTO'
    and table1.id = table2.id
    and table2.entreid = '13';

    + le LIMIT, mais comme je ne connais pas la syntaxe, je m'abstiens

    cela dit, je suis un peu surpris que ton entreid soit une chaine de caractères.
    Si c'est censé être un identifiant avec que des chiffres, c'est probablement
    un numérique, donc 13 plutôt que '13'
    • [^] # Re: jointure

      Posté par  . Évalué à 2.

      Je pertinente, et je rajoute : la plupart des requêtes imbriquées peuvent se réécrire sous forme de jointures ; celles-ci sont généralement à privilégier car mieux supportées et donc plus portables.

      Par contre, je préfère la syntaxe ANSI, plus explicite à mon goût :

      SELECT t1.nom
      FROM
        table1 t1
        INNER JOIN table2 t2 ON t1.id = t2.id
      WHERE
        t2.entreid = '13'
        AND t1.prenom = 'TOTO'


      Après, quelques tests de performances pour s'assurer de la meilleure solution sont toujours bienvenus...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.