Requête multipliée ...

Statut
N'est pas ouverte pour d'autres réponses.
1er
OP
SkYlEsS

SkYlEsS

Elite
J'ai une table ad_joueurs et une autre ad_fournitures.

Chaque id_joueur doit se retrouver dans ad_fournitures sous le champ id_joueur également. Mais seulement, j'en ai plus (???).

Ainsi, je devrais vérifier que l'id_joueur de ad_fournitures apparait dans ad_joueurs (sous id_joueurs également donc) sinon il s'efface.

Comment faire ? :-D
 

Bingo

Beer Addict
SkYlEsS a dit:
Chaque id_joueur doit se retrouver dans ad_fournitures sous le champ id_joueur également. Mais seulement, j'en ai plus (???).
Je ne comprends pas bien.
Tu n'en as plus, ou tu en as plus ?

Ainsi, je devrais vérifier que l'id_joueur de ad_fournitures apparait dans ad_joueurs (sous id_joueurs également donc) sinon il s'efface.
Ca c'est facile, c'est comme tes premières requêtes :

Code:
DELETE FROM ad_fournitures 
WHERE NOT EXISTS (SELECT * FROM ad_joueurs WHERE ad_joueurs.id_joueur = ad_fournitures.id_joueur)
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Bingo a dit:
Je ne comprends pas bien.
Tu n'en as plus, ou tu en as plus ?
J'écris (presque) toujours correctement, surtout lorsqu'il s'agit de la négation que trop souvent négligée ...

Autrement dit, j'en ai plus dans cette table que dans l'autre. ;)

Merci pour le code, je vais test.

Sinon, si je dois effacer tous les id inférieur à X exceptés les id Y et Z ? 'fais comment ? o_O
 

Bingo

Beer Addict
SkYlEsS a dit:
Autrement dit, j'en ai plus dans cette table que dans l'autre.
OK, mais je ne comprends toujours pas : quel est le problème dans le fait d'en avoir plus dans cette table ?
Tu veux dire que tu as certains id_joueur de ta table ad_fournitures qui ne se trouvent pas dans ta table ad_joueur ?
Je ne vois pas en quoi c'est problèmatique ?

Sinon, si je dois effacer tous les id inférieur à X exceptés les id Y et Z ? 'fais comment ?
Soit je n'ai rien compris, soit c'est trivial :

WHERE (id<X AND id <> Y AND id <> Z)
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Bingo a dit:
OK, mais je ne comprends toujours pas : quel est le problème dans le fait d'en avoir plus dans cette table ?
Tu veux dire que tu as certains id_joueur de ta table ad_fournitures qui ne se trouvent pas dans ta table ad_joueur ?
Je ne vois pas en quoi c'est problèmatique ?
Ben, ils prennent de la place et je peux les effacer :p

id <> ça veut dire excepté alors ? :=)

En fait, j'ai les tables ad_forum et ad_post_it. J'aimerais effacer tous les champs de ad_forum dont l'id est inférieur à 2000 (par exemple) sauf si l'id est contenue dans ad_post_it (champ id également).
 

Bingo

Beer Addict
SkYlEsS a dit:
Ben, ils prennent de la place et je peux les effacer


id <> ça veut dire excepté alors ?
Ca veut dire "différent".

SkYlEsS a dit:
En fait, j'ai les tables ad_forum et ad_post_it. J'aimerais effacer tous les champs de ad_forum dont l'id est inférieur à 2000 (par exemple) sauf si l'id est contenue dans ad_post_it (champ id également).
Toujours selon le même principe :

DELETE FROM ad_forum
WHERE id < 2000 AND id NOT IN (SELECT DISTINCT id FROM ad_post_it);

C'est assez parlant, c'est presque de l'anglais : "efface de la table ad_forum où id est inférieur à 2000 et id n'est pas parmi (les id de la table ad_post_it)"
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Oki, j'n'étais pô sur :-D

Faudra que j'm'informe sur ce IN, il semble revenir pour pas ma de manipulation mais le meilleur reste les jointures. :roll:

Merci ! (Si j'ai d'autres questions, je reviendrai sur ce topic :proud: )
 

Bingo

Beer Addict
SkYlEsS a dit:
Faudra que j'm'informe sur ce IN, il semble revenir pour pas ma de manipulation mais le meilleur reste les jointures.
Ca dépend.
Par exemple, pas mal de moteurs de bases de données optimisent les requêtes du type "IN" pour s'arrêter dès qu'une correspondance à été trouvée.

Si tu fais "SELECT field FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE t2.id IS NOT NULL;" toute la table t2 est scannée pour chaque id de t1, pour obtenir toutes les valeurs jointes.
C'est inefficace car ton but est simplement de trouver celles qui sont dans t2.

Si tu fais "SELECT field FROM t1 WHERE id IN (SELECT id FROM t2);", le moteur de base de donnée sait que tu veux seulement savoir si il y a un id correspondant dans t2. Dès qu'il l'a trouvé, il arrête de scanner la table (ou l'index).
C'est plus efficace.

Mais ce genre d'optimisation dépend de la base de données que tu utilises, il n'y a pas de recommandation qui soit vraie pour tous les moteurs de bases de données.
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Moi je vois surtout ces jointures-ci (externes) :

Code:
$sql = mysql_query("SELECT ad_joueurs.nom_joueur, ad_fournitures.type_1 WHERE ad_fournitures.id_joueur = ad_joueurs.id_joueur AND ad_joueurs.id_joueur = '$id_joueur' LIMIT 1");
$result = mysql_fetch_array($sql);
Au fait, ça donne quoi ceci :

Code:
DELETE FROM ad_forum
WHERE id < 2000 AND id NOT IN (SELECT DISTINCT id FROM ad_post_it);
==> mysql_query("DELETE FROM ad_forum WHERE id < 2000 AND id NOT IN (SELECT DISTINCT id FROM ad_post_it)"); ?

ne faut-il pas un mysql_fetch_array pour les SELECT ? :colere:
 

Bingo

Beer Addict
Oui, pour le requêtes comme celle que tu postes, un JOIN est nécessaire (tu récupères des données dans les deux tables, donc tu es obligé de les joindre).

Pour ton autre question je n'en sais rien, je ne connais rien à PHP (ça ressemble à du PHP ton truc).
Il doit bien y avoir moyen d'exécuter une requête qui ne retourne pas d'enregistrements en PHP, non ?
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Code:
DELETE FROM ad_fournitures 
WHERE NOT EXISTS (SELECT * FROM ad_joueurs WHERE ad_joueurs.id_joueur = ad_fournitures.id_joueur)
'fonctionne pô :-(
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Est-ce quelqu'un saurait comment faire pour que le menu s'affiche sous IE comme il s'affiche sous FireFox ... ? =]
 

Bingo

Beer Addict
SkYlEsS a dit:
Code:
DELETE FROM ad_fournitures 
WHERE NOT EXISTS (SELECT * FROM ad_joueurs WHERE ad_joueurs.id_joueur = ad_fournitures.id_joueur)
'fonctionne pô :-(
Comment ça ?
Quelle version de MySQL ?
 

Bingo

Beer Addict
SkYlEsS a dit:
1000gp d'OVH ... php4 nan ?
MySQL 5 plutôt. ;)

Je ne vois pas pourquoi ça ne marcherait pas.

Tu peux essayer d'autres syntaxes équivalentes :

Code:
DELETE FROM ad_fournitures 
WHERE id_joueur NOT IN (SELECT id_joueur FROM ad_joueurs);
 
1er
OP
SkYlEsS

SkYlEsS

Elite
SkYlEsS a dit:
Est-ce quelqu'un saurait comment faire pour que le menu s'affiche sous IE comme il s'affiche sous FireFox ... ? =]
Personne ? :-'
 
1er
OP
SkYlEsS

SkYlEsS

Elite
guslinux a dit:
Nan, j'espèrais trouver la réponse dans la config' de ton menu mais en vain.

Mon menu est un doux subtil mélange d'alsacreation (le tien ... démasqué !) mais en table :-D (comme GamerZ au fait, enfin vbulletin)

Et j'ai finalement réussi ... comme d'hab', j'avais trébuché simplement et bêtement sur un <div> dont le css est : float: left que je devais rajouter à un certain (et pô un autre) endroit.

Youpie. Je crois qu'en tout, j'aurai bien passer 24h pour faire ce menu ... :D
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Bingo a dit:
MySQL 5 plutôt. ;)

Je ne vois pas pourquoi ça ne marcherait pas.

Tu peux essayer d'autres syntaxes équivalentes :

Code:
DELETE FROM ad_fournitures 
WHERE id_joueur NOT IN (SELECT id_joueur FROM ad_joueurs);
'fonctionne pô non plus ... serait-ce parce que j'utilise phpMyAdmin-2.5.7 ?
 

Bingo

Beer Addict
Non je ne pense pas.
Tu n'as pas de message d'erreur ? Qu'est-ce qui te fait dire que ça ne marche pas ?
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut