Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2011, 15h21   #1
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Par défaut Probleme de Doublons - #1064

Bonjour,
Je ne pense pas qu'il soit utile de préciser le contexte ou de coucher les tables (si il le faut, je le ferais sans fautes ~).
Donc voilà, je voulais afficher les doublons, ce que j'arrive à faire (pas trop dur avec le tutoriel présent) mais là où ça peche, c'est à la suppression.
Je me trouve avec cette erreur :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'M1 WHERE M1.id < ANY (SELECT M2.id FROM musique_tbl M2 WHERE M1.id <> M2.id' at line 2

Pour cette requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DELETE 
FROM musique_tbl M1
WHERE M1.id < ANY
                    (SELECT M2.id
                    FROM musique_tbl M2
                    WHERE  M1.id <> M2.id
                    AND M1.id_musique = M2.id_musique
                    AND M1.artiste = M2.artiste
                    AND M1.titre = M2.titre
                    AND M1.annee = M2.annee
                    AND M1.album = M2.album
                    AND M1.label = M2.label
                    AND M1.site_web = M2.site_web
                    AND M1.pays = M2.pays
                    AND M1.chemin = M2.chemin
                    AND M1.bam = M2.bam
                    AND M1.etat = M2.etat
                    AND M1.id_album = M2.id_album
                    AND M1.paroles = M2.paroles
)
Personnellement, j'comprend pas, sachant que je suis le tutoriel à la lettre :/
Ou alors j'ai loupé quelque chose d'important ^.^'

Une réponse ?
Merci d'avance,
Satsu.
Satsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h03   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

C'est un tutoriel écrit pour MySQL ?

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 11h58   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
MySQL ne supporte les quantificateurs ANY et ALL que depuis la version 4.1.
Pour ce qui est des sous requêtes dans les ordres de mise à jour (INSERT, UPDATE et DELETE) je crois que MySQL ne sait toujours pas faire grand chose !!!!!

Démo :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE Articles (
   ArticleID SMALLINT NOT NULL PRIMARY KEY,
   ArticleTitle VARCHAR(60) NOT NULL,
   Copyright YEAR NOT NULL
)
ENGINE=INNODB;
 
INSERT INTO Articles VALUES (12786, 'How write a paper', 1934),
                            (13331, 'Publish a paper', 1919),
                            (14356, 'Sell a paper', 1966),
                            (15729, 'Buy a paper', 1932),
                            (16284, 'Conferences', 1996),
                            (17695, 'Journal', 1980),
                            (19264, 'Information', 1992),
                            (19354, 'AI', 1993);
-- premier test :
Code :
1
2
3
4
DELETE Articles 
WHERE  Copyright < ANY (SELECT Copyright
                         FROM   Articles
                         WHERE  ArticleTitle LIKE '% a %');
MySQL Database Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Copyright < ANY (SELECT Copyright
FROM Articl' at line 2 18 0


Code :
1
2
3
CREATE TABLE an  (A YEAR NOT NULL);
 
INSERT INTO an VALUES (1950), (1960);
-- 2e essai :
Code :
1
2
3
DELETE Articles 
WHERE  Copyright < ANY (SELECT A
                         FROM   an)
Error 26/05/2011 11:54:01 0:00:00.000 <link> - MySQL Database Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Copyright < ANY (SELECT A
FROM an)' at line 2 27 0

Bref, les quantificateurs ANY et ALL ne sont pas supportés du tout dans les sous requêtes de mise à jour !

C'est une des nombreuses limitations de MYSQL.
A lire sur cet ersatz de SGBDR : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h13   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
oui tu peux t'en servir que comme le quantificateur in dans les requêtes...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h00   #5
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Ah, bah, merci de vos réponses même si c'est pas vraiment ce que j'attendais (au niveau du résultat).
Du coup, j'vais me débrouiller autrement.

Peut-être à rajouter dans le tutoriel sur les doublons ? Que certains SGBDR ne supportent pas cette solution ? (ou alors c'est noté et j'ai pas vu ._.)

Merci d'avoir pris le temps de répondre, je note comme "résolu".

EDIT : Je viens de lire ton article, bah je me doutais pas de tous ces défauts à vrai dire. Ca ouvre les yeux comme on dit ~
Satsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h02   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Citation:
Envoyé par Satsu Voir le message
Peut-être à rajouter dans le tutoriel sur les doublons ? Que certains SGBDR ne supportent pas cette solution ? (ou alors c'est noté et j'ai pas vu ._.)
Mais MySQL n'est pas vraiment un SGBD relationnel, c'est pourquoi il est très limité en terme de SQL...

Mieux vaut donc l'éviter si l'on veut faire des choses proprement !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h10   #7
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Ma Base n'étant pas relationnel, je n'y voyais pas trop d'inconvénients à travailler dessus, mais je dois avouer que passer une journée sur une requête banale sans la voir aboutir pour quelle raison ? La limitation du SGBDR ? C'est assez frustrant.

Je suis en stage actuellement, mais a l'avenir, je retiens !
Merci,
Satsu.
Satsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h19   #8
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
tu peux contourner le problème en créant une table temporaire avec ta sous requête et utiliser une jointure pour établir ta condition d'infériorité...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h25   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Si ma mémoire est bonne, ce problème est lié au fait que MySQL ne sait pas insérer, mettre à jour ou supprimer lorsque la table concernée est dans une auto-jointure dans la requête, comme c'est le cas implicitement avec la sous requête ici.

Il faut alors créer une table temporaire avec une requête SELECT qui isole les doublons à supprimer puis faire une jointure de la vraie table avec la table temporaire pour supprimer réellement les doublons.

Dans ton cas, je crois que ça donnerait un truc de ce genre :
Code :
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
CREATE TEMPORARY TABLE tmp
SELECT DISTINCT M1.id
FROM musique_tbl M1
WHERE EXISTS 
(
    SELECT *
    FROM musique_tbl M2
    WHERE M2.id < M1.id
        AND M1.id_musique = M2.id_musique
        AND M1.artiste = M2.artiste
        AND M1.titre = M2.titre
        AND M1.annee = M2.annee
        AND M1.album = M2.album
        AND M1.label = M2.label
        AND M1.site_web = M2.site_web
        AND M1.pays = M2.pays
        AND M1.chemin = M2.chemin
        AND M1.bam = M2.bam
        AND M1.etat = M2.etat
        AND M1.etat = M2.etat
        AND M1.id_album = M2.id_album
        AND M1.paroles = M2.paroles
) ;
 
DELETE 
FROM musique_tbl m1
INNER JOIN tmp ON tmp.id = m1.id;
Vérifie quand même la requête SELECT toute seule avant de lancer les deux !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h34   #10
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Merci !
J'ai tenté de bidouiller mais ca faisait un peu "foireux" ~
Créer une table temporaire m'était venu à l'esprit mais je pensais qu'il y avait "plus simple" (tout est relatif après ^^').

En tout cas, ca marche impeccable
Merci bien !
Satsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h34.


 
 
 
 
Partenaires

Hébergement Web