Requête multipliée ...

Discussion dans 'Web, design' créé par SkYlEsS, 3 Avril 2007.

Statut de la discussion:
Fermée.
  1. Offline
    SkYlEsS Kawai
    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
    SkYlEsS, 10 Avril 2007
    #21
  2. Offline
    Bingo Beer Addict
    Je ne comprends pas bien.
    Tu n'en as plus, ou tu en as plus ?

    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)
    Bingo, 10 Avril 2007
    #22
  3. Offline
    SkYlEsS Kawai
    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
    SkYlEsS, 10 Avril 2007
    #23
  4. Offline
    Bingo Beer Addict
    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 ?

    Soit je n'ai rien compris, soit c'est trivial :

    WHERE (id<X AND id <> Y AND id <> Z)
    Bingo, 10 Avril 2007
    #24
  5. Offline
    SkYlEsS Kawai
    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).
    SkYlEsS, 10 Avril 2007
    #25
  6. Offline
    Bingo Beer Addict
    Ca veut dire "différent".

    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)"
    Bingo, 10 Avril 2007
    #26
  7. Offline
    SkYlEsS Kawai
    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: )
    SkYlEsS, 10 Avril 2007
    #27
  8. Offline
    Bingo Beer Addict
    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.
    Bingo, 10 Avril 2007
    #28
  9. Offline
    SkYlEsS Kawai
    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:
    SkYlEsS, 10 Avril 2007
    #29
  10. Offline
    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 ?
    Bingo, 10 Avril 2007
    #30
  11. Offline
    SkYlEsS Kawai
    Code:
    DELETE FROM ad_fournitures 
    WHERE NOT EXISTS (SELECT * FROM ad_joueurs WHERE ad_joueurs.id_joueur = ad_fournitures.id_joueur)  
    'fonctionne pô :-(
    SkYlEsS, 10 Avril 2007
    #31
  12. Offline
    SkYlEsS Kawai
    Est-ce quelqu'un saurait comment faire pour que le menu s'affiche sous IE comme il s'affiche sous FireFox ... ? =]
    SkYlEsS, 10 Avril 2007
    #32
  13. Offline
    Bingo Beer Addict
    Comment ça ?
    Quelle version de MySQL ?
    Bingo, 10 Avril 2007
    #33
  14. Offline
    SkYlEsS Kawai
    1000gp d'OVH ... php4 nan ? :)
    SkYlEsS, 10 Avril 2007
    #34
  15. Offline
    Bingo Beer Addict
    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);
    Bingo, 10 Avril 2007
    #35
  16. Offline
    SkYlEsS Kawai
    Personne ? :-'
    SkYlEsS, 10 Avril 2007
    #36
  17. Offline
    guslinux Gamerz'ien
    Mon menu ?
    guslinux, 10 Avril 2007
    #37
  18. Offline
    SkYlEsS Kawai
    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
    SkYlEsS, 11 Avril 2007
    #38
  19. Offline
    SkYlEsS Kawai
    'fonctionne pô non plus ... serait-ce parce que j'utilise phpMyAdmin-2.5.7 ?
    SkYlEsS, 11 Avril 2007
    #39
  20. Offline
    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 ?
    Bingo, 11 Avril 2007
    #40
Statut de la discussion:
Fermée.