Vieille requete SQL a la con qui marche pas - Programmation
Marsh Posté le 18-10-2001 à 10:12:33
essaye ca:
delete from users
where users.id=
(Select users_stats.id from users_stats where level = 0)
Marsh Posté le 18-10-2001 à 10:13:14
Salut,
Si la deuxieme partie de ta requete "Select id from users_stats where level = 0" ramène plusieurs enregistrement, celà ne risque pas de marcher.
Dans ce cas, ta requête doit devenir :
delete from users
where id IN
(Select id from users_stats where level = 0)
Marsh Posté le 18-10-2001 à 10:15:54
iskream a écrit a écrit : Salut, Si la deuxieme partie de ta requete "Select id from users_stats where level = 0" ramène plusieurs enregistrement, celà ne risque pas de marcher. Dans ce cas, ta requête doit devenir : delete from users where id IN (Select id from users_stats where level = 0) |
pas mieux
Marsh Posté le 18-10-2001 à 10:18:38
En fait je crois que c mysql qui n accepte pas les requetes imbriqués, j suis pas dans la merde la...
Marsh Posté le 18-10-2001 à 10:19:19
Sebastien a écrit a écrit : En fait je crois que c mysql qui n accepte pas les requetes imbriqués, j suis pas dans la merde la... |
si, mysql les acceptent sans problème.
Marsh Posté le 18-10-2001 à 10:21:19
Ben c pas ce qui est dit sur le forum de phpfrance ou un truc comme ca..
Car la derniere partie de la requete toute seule fonctionne correctement...
Les deletes sur des conditions de la meme table aussi...
Marsh Posté le 18-10-2001 à 10:21:35
Sebastien a écrit a écrit : En fait je crois que c mysql qui n accepte pas les requetes imbriqués, j suis pas dans la merde la... |
MySQL est certes limité, mais pas à ce point là...il respecte quand meme les standards SQL
Marsh Posté le 18-10-2001 à 10:22:33
iskream a raison dans le principe mais voila une meilleure facon décrire la requete (d'un point de vue optimisation) :
DELETE FROM USERS A
WHERE EXISTS ( SELECT 'X' FROM USERS_STATS B WHERE B.ID = A.ID AND B.LEVEL = 0 );
Marsh Posté le 18-10-2001 à 10:24:25
ipzorj a écrit a écrit : iskream a raison dans le principe mais voila une meilleure facon décrire la requete (d'un point de vue optimisation) : DELETE FROM USERS A WHERE EXISTS ( SELECT 'X' FROM USERS_STATS B WHERE B.ID = A.ID AND B.LEVEL = 0 ); |
En effet, la clause IN a pour effet de plomber quelques peu les performances quand le volume commence à être conséquent.
Marsh Posté le 18-10-2001 à 10:33:19
Ca ca fonctionne
SELECT A.ID
FROM USERS_STATS AS B, USERS AS A
WHERE B.UID = A.UID
mais ca non :
SELECT ID
FROM USERS
where id exists (select id from users_stats)
ni
SELECT ID
FROM USERS
where id in (select id from users_stats)
Marsh Posté le 18-10-2001 à 10:38:02
Vu a different endroit :
saches que sous MySQL est assez limité en fait mais tu ne peux pas faire de REQUETES imbriquées par exemple...ce qui s'avère très embetant car tu dois le 'simuler' apres avec un tit traitement en php
et dans tous les cas MySQL ne fait pas de requetes imbriquées.
Pas évident avec mySQL parce qu'il n'accepte pas les sous requêtes
Marsh Posté le 18-10-2001 à 10:43:21
et avec une jointure ca marcherai pas?
a mon avis si c possible faut eviter les requettes imbriqué , je pense que ca peu devenir vite lourd surtt ds l'écriture.
delete from users U, users_stats S
where U.id= S.Id And S.level=0
mais bon je me trompe peut etre
@++
[edtdd]--Message édité par saxgard--[/edtdd]
Marsh Posté le 18-10-2001 à 10:44:42
Moi aussi, j'ai été bloqué pour certaines requêtes à cause de MySQl et par expérience, je peux le dire, MySQL ne suporte pas les requêtes imbriquées.
Marsh Posté le 18-10-2001 à 10:47:09
saxgard a écrit a écrit : et avec une jointure ca marcherai pas? a mon avis si c possible faut eviter les requettes imbriqué , je pense que ca peu devenir vite lourd surtt ds l'écriture. delete from users U, users_stats S where U.id= S.Id And S.level=0 mais bon je me trompe peut etre @++ |
Une jointure, ca marche très bien si tu fait un select sur les deux tables.
Par contre, je vois pas comment on peut faire une jointure entre un select et un delete.
Marsh Posté le 18-10-2001 à 10:48:08
Ben j'y avais aussi pense mais je crois pas que tu puisses faire de jointure dans un delete, car la il va se baser sur 2 tables, c pas tres bon, voir ca risque d'etre chaud.
Il va me virer et dans user_stat et dans user la, quoique a la fin c bien ce que j'aurais voulu faire
Marsh Posté le 18-10-2001 à 10:48:32
arf j'avais pas vu que ca avais déja étais dis les jointures , mais alors la je voix plus ou est le pb
Sebastien si ca marche opurquoi tu ne fais pas comme ca alors?
Marsh Posté le 18-10-2001 à 10:49:19
ah oauis pasbete , alors ta question est pertinente
passe sous access alors
bin alors personnellement ca m'étonne que mysql n'accepte pas les requetes imbriqués parceque des fois elles sont innévitable
[edtdd]--Message édité par saxgard--[/edtdd]
Marsh Posté le 18-10-2001 à 10:50:38
Car a la base c pas un select que je veux faire mais un delete.
Je prenais le cas du select, car c plus connu plus comprehensible, et ceux qui connaissent le sql, savent ce que retourne un select. C le plus connu et plus simple.
Marsh Posté le 18-10-2001 à 10:54:58
bon sinonj'ai une solution batard
tu fais ta requete sur users_stats
et ensuite tu boucle et tu delete chaque élément dans users
je sais c pas tres jolie mais ca marche
[edtdd]--Message édité par saxgard--[/edtdd]
Marsh Posté le 18-10-2001 à 11:00:04
ui mais ta pas 1674 users avec un level=0 non?
mais bon comme je t'ai dis c une solution batarde mais qui a le mérite de marcher, au moin tu n'est pas bloqué au cas ou
cela dis 1674 c'est pas énorme je pense
bonne chance @+
Marsh Posté le 18-10-2001 à 11:14:28
faire 1400 delete a la main, merci mais non merci, je vais etre oblige de faire un petit prog php, c pas trop grave, mais bon quand je vois le ansi sql le fait directos..
Marsh Posté le 18-10-2001 à 11:19:50
a la main a j'ai du raté une étape
je pensé que c'étais en php ou un truc ds le genre
Marsh Posté le 18-10-2001 à 11:37:52
Sebastien a écrit a écrit : faire 1400 delete a la main, merci mais non merci, je vais etre oblige de faire un petit prog php, c pas trop grave, mais bon quand je vois le ansi sql le fait directos.. |
C'est exactement ce que saxgard
voulais te dire de faire, un script php pour tout effacé.
Marsh Posté le 18-10-2001 à 12:11:10
Ouais ben voila c fait, je disais que ca me fait mal de faire ca alors que le ansi sql le fais directement sans prog ni rien.
Marsh Posté le 18-10-2001 à 12:40:42
ui je comprends bien mais des fois faut s'adapter avec l'outil qu'on a meme sic pas la meilleur solution , cependnat je pense aps qu'ele sois si horrible , mais la je pourrais pas dire
en tt cas je vais essayer de voir si je connaitrai pas une autre solution , bonne chance @+
Marsh Posté le 18-10-2001 à 14:27:59
Na c bon te casse pas la tete je l'ai ecrite la fonction, c clair c rien du tout, mais bon c dommage.
Marsh Posté le 18-10-2001 à 16:21:26
O oui mais bon c pas non plus les meme prix, et pas sur que ma boite accepte la difference, de plus ici nos bd oracle sont ctiques j suis pas sur qu'ils accepteront que j'y touche et comme j suis pas admin bdd/vms je prefere pas
Marsh Posté le 18-10-2001 à 10:02:11
delete from users
where id=
(Select id from users_stats where level = 0)
Marche pas...
Les noms sont bon et je pensais que la typographie aussi mais ca a pas l'air d'etre le cas