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 :

suppression avec sous requête conditionnelle


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 17
    Points : 15
    Points
    15
    Par défaut suppression avec sous requête conditionnelle
    Bonsoir tout le monde

    J'ai un problème avec cette requete sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM lien_entre_album_et_photo WHERE id_photo in (SELECT id_photo FROM lien_entre_album_et_photo WHERE id_album=1)
    Voici le message d'erreur :
    MySQL said:

    #1093 - You can't specify target table 'lien_entre_album_et_photo' for update in FROM clause
    Normalement "MySQL 4.1.1a-alpha-nt-log" devrait supporter les sous-requêtes. D'ailleur ca marche avec les SELECT, mais là apparement ca ne marche pas avec un DELETE .
    Est-ce un problème lié à MySQL, ou bien une erreur dans ma requete ?
    J'aimerai tant que sa soit une erreur de requete. J'ai eu tant de mal à installer MySQL sous Windows

    Merci d'avance

    melmel

  2. #2
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut Re: suppression avec sous requête conditionnelle
    Citation Envoyé par melmel
    Bonsoir tout le monde

    J'ai un problème avec cette requete sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM lien_entre_album_et_photo WHERE id_photo in (SELECT id_photo FROM lien_entre_album_et_photo WHERE id_album=1)
    salut, t'as pas l'impression de te mordre la queue ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM lien_entre_album_et_photo WHERE id_album=1
    devrait faire ce que tu veux, non ?
    Bon, je répond pas à ta question ... mais y'a pas un problème de récursivité ou quelque chose dans le genre dans ta requête ?
    a+

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonsoir

    Voilà un exemple pour mieux visualiser le probleme :

    Dans ma table 'lien_entre_album_et_photo' j'ai ces données là :
    id_album | id_photo
    1----------->1
    1----------->2
    1----------->3
    1----------->4
    2----------->5
    2----------->6
    2----------->3
    Une photo peut donc appartenir à plusieurs albums. Dans ce cas là, la photo 3 appartient à l'album 1 et 2.
    Je voudrais que toutes les lignes où il y a une photo appartenant à l'album 1 soient supprimées. La table finale serait alors :
    id_album | id_photo
    2----------->5
    2----------->6
    C'est clair qu'il y a un probleme de récursivité dans ma requete.

    Y a-t-il une solution à mon probleme ?

    melmel

  4. #4
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    ok, ben là, à par le programmer, je vois pas ...
    en tout cas, ça dépasse mes compétences en mySQL, si quelqu'un a une autre idée ...

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    toujours la même proposition : utiliser une table temporaire
    et toujours la même question : pour des bonnes performance, tables temporaires ou programmation ?

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci pour vos idées.
    Je pense que je vais utiliser une table temporaire.
    Mais dans mysql, les tables temporaires, ce sont des tables spéciales ou des simples tables ?
    Je traduit :
    Est-ce que les tables temporaires sont stockées différements ?
    Quelle est la différence entre une table temporaire ou non à par le fait qu'une table normale réside tout le temps dans la base et que la table temporaire, dès que je n'en ai plus besoin je l'efface.
    Est-ce que une table temporaire, c'est juste une simple table que j'efface à la fin (c'est ce que j'ai compri en lisant une doc). Ou bien c'est une table spéciale qui s'efface toute seule, qui a un usage unique ?
    La table temporaire est elle toujours unique ? Sinon, comment assurez-vous son unicité ?

    C'est un peu flou pour moi les tables temporaire.
    En gros, c'est quoi la différence entre une table temporaire et une simple table ? (aussi bien dans son utilisation que dans son implémentation)

    melmel

    PS : est-ce que innodb peut résoudre mon probleme de sous-requete avec un DELETE ?

  7. #7
    Membre régulier
    Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 94
    Points : 116
    Points
    116
    Par défaut
    avec cette commande meme en 4.0 ca doit marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete lien_entre_album_et_photo from lien_entre_album_et_photo A, lien_entre_album_et_photo B 
    where B.id_photo=A.id_photo and B.id_album=1
    Selecta

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    tables temporaires : tout est expliqué ici :
    http://www.mysql.com/doc/fr/CREATE_TABLE.html

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci selecta pour ta réponse, simple, claire, précise, et redoutablement efficace
    Et en plus, c'est tellement jolie comme façon de faire

    Merci pour ton lien mathix. Je l'avais déjà trouvé mais il y a tellement d'information sur cette page qu'on n'en voit pas la fin. Je viens de la relire rapidement et finalement il y a un paragraphe très intéressant sur les tables temporaires.

    Encore merci

    melmel

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

Discussions similaires

  1. [MySQL] Condition IN avec sous requête
    Par emphase dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/02/2007, 01h43
  2. [MySQL] erreur avec sous-requête
    Par Piou2fois dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/02/2006, 13h44
  3. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  4. DELETE avec sous-requête
    Par say dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2005, 08h20
  5. INTERBASE: DELETE avec sous requete conditionnelle
    Par Papino dans le forum InterBase
    Réponses: 6
    Dernier message: 17/02/2005, 22h55

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