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

Langage SQL Discussion :

[MySQL 3.23] Delete


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut [MySQL 3.23] Delete
    bonsoir,

    J'ai un gros problème avec la requete delete... Je suis sous mysql 3.23.58 Voila ce que je voudrais faire :
    J'ai une table 1 ou je ne fais que des insertions :
    1) elle reprend les données d'une autre table 2
    2) elle rajoute avec celle qui existeraient déjà dans la table 1
    3) je crée une nouvelle entrée dans la table 1 qui fait la somme des entrées décrites ci dessus.

    Au départ, je ne voulais pas faire comme ca.
    Je voulais faire une sorte de if not exist insert else update mais je n'ai pas trouvé une syntaxe qui fonctionnait correctement sous mysql 3.23.58... Je ne peux pas vous donner la structure exacte de la table 1 mais voila en gros la description de la table1 :
    - la clé primaire id
    - 2 champs champ1 et champ2
    - 1 champs nombre qui compte le nombre d'entrée du couple champ1 champ2 dans la table2
    - un champ prix qui récupére le prix correspondant au champs1 et 2 dans une table3

    Je voulais donc faire au début un update du prix dans la table2 à chaque fois mais ca ne fonctionne pas.. Pourquoi? parce que, avec update, je n'ai pas réussi à faire en sorte qu'il update toutes les lignes de ma table 1 en fonction de ce qu il trouve dans la table des prix. Il me met que je retourne dans mon select plus d'une entrée, ce qui est en fait normal...

    J'en suis donc arrivé à l'insert comme solution...

    Seulement voila mon problème :
    Dans ma table 1 j'aurai donc 3 entrées pour chaque couple champ1 champ2. Je voudrai qu'il n'en reste qu'un seul donc pour différencier les couples, j'ai mis un champs date. Je voulais jsute garder le couple champ1 champ2 qui est le plus récent et supprimer les anciens.

    Voila ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    DELETE  FROM table1 WHERE ( champ1,
    champ2,
    unix_timestamp( created_on )) IN (  SELECT table1.champ1,
    table1.champ2, min( unix_timestamp( table1.created_on
    )  )
    FROM table2 a
    WHERE a.champ1 = table1.champ1 AND a.champ2
    table2.champ2 group by champ2);
    Ca ne fonctionne pas comme je veux, il me supprime toutes les entrées dans la table ou rien selon que je mette ou non le min avant le from...
    Pourtant, qd j'isole le select, les résulats de la requêtes correspondent à celle que je veux ... Quelqu'un peut m'aider? C'est assez urgent...

    Merci

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    je ne sais pas si ca te convient, mais cette requete devrait t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete from from table1 where (champ1,champ2, created_on) not in (
    select champ1,champ2, max(created_on) from table2 group by champ1, champ2)
    Ceci dit, quand tu ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    in( SELECT table1.champ1, 
    table1.champ2, min( unix_timestamp( table1.created_on 
    )  ) 
    FROM table2 a 
    WHERE a.champ1 = table1.champ1 AND a.champ2 
    table2.champ2 group by champ2)
    Je ne suis pas persuadé que cela soit permis sous MySql en effet, la fonction IN est elle meme le resultat d'une requete independante or la tu fais un lien avec la table1 qui n'est pas declaré dans cette "sous" requete.


    - 1 champs nombre qui compte le nombre d'entrée du couple champ1 champ2 dans la table2
    Quel est l'interet de ce champ ???
    Une simple requete de donnera la valeur. Tu n'as pas peur d'avoir des incoherences dans ta table ?

    Tu n'as pas la possibilité de migrer vers une version plus recente de Mysql et ainsi pouvoir utiliser les triggers, qui dans ton cas seraient beaucoup plus adequates ?

    J'espere t'avoir un petit peu aidé

    bon courage

  3. #3
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Yep je me suis débrouillé autrement je donnerai la solution plus tard Merci qd meme

Discussions similaires

  1. Mysql Pb d'exécution de DELETE
    Par Mengué georges dans le forum JDBC
    Réponses: 8
    Dernier message: 16/05/2007, 15h16
  2. [MySql 4.0] - DELETE avec un SELECT
    Par JuS80 dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/01/2007, 11h00
  3. [MySQL] DELETE en cascade..ma requete ne marche pas
    Par debie1108 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/10/2006, 16h54
  4. [MySQL 3.23.58] index et delete
    Par GLDavid dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/08/2006, 15h08
  5. [MySQL 3.23.58] delete multi-tables
    Par GLDavid dans le forum Requêtes
    Réponses: 8
    Dernier message: 07/08/2006, 11h45

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