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 :

requête de suppression [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    iut amiens
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : iut amiens
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 29
    Points
    29
    Par défaut requête de suppression
    Bonjour à tous,

    j'aimerai réaliser une requête qui supprime le score le plus faible dans ma table "score"

    j'ai essayé cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM `score` WHERE scoreJoueur = MIN(scoreJoueur)
    mais visiblement je m'y prend de la mauvaise manière...

    J'ai aussi essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM `score` WHERE scoreJoueur = (SELECT DISTINCT MIN(scoreJoueur) FROM score)
    Mais ça ne fonctionne pas ...

    Avez vous une idée s'il vous plaît?

  2. #2
    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 378
    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 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut Kaela.

    Il nous faudrait le descriptif de ta table et aussi l'erreur que tu as eu avec ta seconde solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM `score` WHERE scoreJoueur = (SELECT DISTINCT MIN(scoreJoueur) FROM score)
    Pour des questions de performances, il faudrait mettre un index sur la colonne 'scoreJoueur'.
    Le distinct ne sert à rien car 'mon(scoreJoueur)' va te retourner qu'une seule valeur.
    Comme tu recherches le minimum du score de tous les joueurs dans ta table, il n'est pas nécessaire de faire une corrélation entre la table appelante et la table appelé.

    Ce que j'aurai fait, c'est plutôt ceci :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (
      `id`        integer unsigned NOT NULL AUTO_INCREMENT,
      `score`     integer          NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO test (`score`) VALUES
    (25),(7),(8),(32),(4),(4)
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+
    | id | score |
    +----+-------+
    |  1 |    25 |
    |  2 |     7 |
    |  3 |     8 |
    |  4 |    32 |
    |  5 |     4 |
    |  6 |     4 |
    +----+-------+
    --------------
    select id
    from test
    where id = (
            select id
            from test as tb1
            where score = (
                    select min(score)
                    from test
            )
            limit 1
    )
    --------------
     
    +----+
    | id |
    +----+
    |  5 |
    +----+
    --------------
    delete from test
    where id = (
            select id
            from (select id
                    from test as tb1
                    where score = (
                            select min(score)
                            from test
                    )
                    limit 1
            ) as x
    )
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+
    | id | score |
    +----+-------+
    |  1 |    25 |
    |  2 |     7 |
    |  3 |     8 |
    |  4 |    32 |
    |  6 |     4 |
    +----+-------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je suppose que ton message d'erreur est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERROR 1093 (HY000) at line 64: You can't specify target table 'test' for update in FROM clause
    Cela signifie que tu ne peux pas mettre directement dans un 'delete' le même nom de table dans la sous-requête (la clause where) qui celle que où tu désires faire la suppression.
    Pour remédier à cela, tu dois créer un niveau supplémentaire comme je l'ai fait :
    Dans le test, comme tu l'as remarqué, il y a deux lignes qui ont le même score.
    J'ai fait en sorte de ne sélectionner que la première ligne, en utilisant un 'limit 1'.
    Autrement dit, dans le cas de doublons, tu n'auras qu'une seule valeur.

    Et pour terminer, j'ai utilisé l'identifiant de la table 'id' plutôt que ton score qui ne doit pas être unique dans toute la table.

    Passe ton sujet en résolu si c'est fini.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    iut amiens
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : iut amiens
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Résolu !
    Merci en effet j'étais en train de travailler sur une solution de ce type.

    Et c'était bien l'erreur que j'avais pour ma deuxième solution !

    Encore merci beaucoup pour ton aide. Je vois bien mon erreur.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  2. [MySQL] Requête de suppression PHP MySQL
    Par lea87 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/01/2008, 15h36
  3. Réponses: 6
    Dernier message: 02/01/2008, 18h15
  4. Requête de suppression
    Par mrcchevalier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/08/2007, 12h08
  5. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04

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