[MySQL 5.0.18] Syntaxe du "NOT IN" modifiée?

Discussion dans 'Web, design' créé par k o D, 2 Novembre 2006.

Statut de la discussion:
Fermée.
  1. Offline
    grosnours ex membre
    Te reste donc plus qu'à faire deux requêtes ... mysql sux ;)
    grosnours, 2 Novembre 2006
    #21
  2. Offline
    Bingo Beer Addict
    Dans ce cas précis il y a moyen de se passer de sous requête :

    SELECT m.idMembre, m.pseudo
    FROM membre AS m LEFT JOIN membreTeam AS mt
    ON (m.idMembre = mt.idMembre AND mt.idLineUp = idLineUp='$_POST[idLineUp]')
    WHERE acces=1 AND mt.idMembre IS NULL;
    Bingo, 2 Novembre 2006
    #22
  3. Offline
    grosnours ex membre
    Y a des jointures en mysql 4.0 ? Jpensais que ça se limite à select,insert,delete :p
    grosnours, 2 Novembre 2006
    #23
  4. Offline
    Bingo Beer Addict
    Mouais, quand même...
    A mon avis même en MySQL 1 il y avait des jointures.
    Sinon tu peux pas vraiment appeler ça SQL... ;)
    Bingo, 2 Novembre 2006
    #24
  5. Offline
    LaRaclure Touriste
    +1 enfin ca c'est de la vraie database SQL
    LaRaclure, 2 Novembre 2006
    #25
  6. Offline
    Bingo Beer Addict
    Ouais, mais va trouver un hébergeur bon marché en PostgreSQL...
    J'ai trouvé Lost Oasis (30¤ HT par an), tout le reste c'est au dessus de 50¤ par an.
    En gros, c'est plus pour ceux qui peuvent se payer un serveur que pour ceux qui sont en hébergement mutualisé.
    Bingo, 2 Novembre 2006
    #26
  7. Offline
    k o D Belge !
    Ben je suis chez OVH en 90 plan qui coûte 65¤ par an et je ne pense pas qu'il y ai PostgreSQL.

    Enfin bon sinon pour la petite histoire, je m'en suis sorti en transformant ma requête de cette manière:

    Code:
    SELECT M.idMembre,M.pseudo, MT.idMembreTeam 
    FROM membreTeam MT NATURAL RIGHT OUTER JOIN membre M
    WHERE M.acces=1
    AND (MT.idMembreTeam IS NULL OR MT.idLineUp <> '$_POST[idLineUp]')
    k o D, 2 Novembre 2006
    #27
  8. Offline
    Bingo Beer Addict
    Effectivement, chez OVH il n'y a pas PostgreSQL.

    Pour ta requête, tu ne devrais pas utiliser de RIGHT JOIN (c'est réputé peu portable), utilise plutôt des LEFT JOIN.
    Et ici, je ne comprends pas pourquoi tu utilises NATURAL ? Ca ne devrait même pas être autorisé, un "NATURAL JOIN" ça joint deux tables sur TOUTES leurs colonnes !
    A mon avis c'est une tolérance de MySQL de te laisser faire ça, mais c'est incorrect.

    Essaye avec la requête que j'ai postée, c'est la méthode "consacrée" pour faire ça sans sous-requête.
    Bingo, 2 Novembre 2006
    #28
  9. Offline
    k o D Belge !
    Oui je teste la tienne, je me suis rendu compte que ma solution est incorrecte.

    Maintenant pour le "NATURAL" je t'avoue que je n'ai fait que recopier de mon cours SQL où nous travaillons en Sybase, çà doit venir de là.
    k o D, 2 Novembre 2006
    #29
  10. Offline
    Bingo Beer Addict
    Ah ouais, OK.
    Un NATURAL JOIN, entre-nous, je n'en ai jamais utilisé.
    C'est vraiment très spécial comme jointure.
    Bingo, 2 Novembre 2006
    #30
  11. Offline
    k o D Belge !
    Mais même ta solution ne me donne pas quelque chose de juste.
    Il me remet quand même une personne qui fait déjà partie du lineup.

    Donc voici ce qu'il doit me retourner:

    l'ensemble des membres qui ont une déjà un line-up (présent de membreTeam donc) mais qui n'appartiennent pas au line-up sélectionné et les membres qui ont un accès à 1 et qui eux ne sont pas encore présent dans un line-up.
    k o D, 2 Novembre 2006
    #31
  12. Offline
    k o D Belge !
    En fait je n'arrive vraiment pas à l'exprimer d'une autre manière que ce que j'avais avant:

    Code:
    SELECT idMembre,pseudo FROM membre WHERE acces=1 
    AND idMembre NOT IN (
    SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]'
    )
    k o D, 2 Novembre 2006
    #32
  13. Offline
    grosnours ex membre
    Exécute le " SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]' ", tape tous les résultats (séparés par des ,) dans un string et exécute l'autre requête en remplaçant la requête précédent par son résultat.

    Il me semble me souvenir qu'on ne peut pas remplacer un NOT IN par une jointure.
    grosnours, 2 Novembre 2006
    #33
  14. Offline
    Bingo Beer Addict
    Ta requête te donne les membres qui ont acces = 1 et qui n'appartiennent pas au lineup selectionné. Elle ne fais pas vraiment ce que tu dis.

    Pour ça tu dois faire :

    SELECT m.idMembre, m.pseudo
    FROM membre AS m LEFT JOIN membreTeam AS mt
    ON (m.idMembre = mt.idMembre)
    WHERE m.acces = 1 AND mt.idMembre IS NULL
    UNION
    SELECT m.idMembre, m.pseudo
    FROM membre AS m LEFT JOIN membreTeam AS mt1
    ON (m.idMembre = mt1.idMembre AND mt1.idLineUp='$_POST[idLineUp])
    LEFT JOIN membreTeam AS mt2
    ON (m.idMembre = mt2.idMembre)
    WHERE mt1.idMembre IS NULL AND mt2.idMembre IS NOT NULL;

    Ou un truc dans le genre quoi...
    Bingo, 2 Novembre 2006
    #34
  15. Offline
    Bingo Beer Addict
    Ca dépend. Celui là on peut.
    Mais sa requête avec son 'NOT IN' ne fait déjà pas ce qu'il veut.
    Bingo, 2 Novembre 2006
    #35
  16. Offline
    k o D Belge !
    Pourtant j'obtiens bien ce que je veux...
    Je m'exprime peut-être mal alors.

    Bon j'ai donc une table membre qui contient les infos principales sur les membres dont un champ "acces" qui m'indique s'il s'agit d'un membre dont il est possible qu'il ait une ou plusieurs référence(s) de sa PK (idMembre) dans un ou plusieurs tuple(s) de ma table membreTeam.

    Tous les membres ne sont donc pas référencés par membreTeam y compris ceux dont l'accès est à '1'.
    k o D, 2 Novembre 2006
    #36
  17. Offline
    k o D Belge !
    Bon celà semble fonctionner.
    Je vais faire des tests pour çà mais à 1ère vue, çà tourne.
    k o D, 2 Novembre 2006
    #37
  18. Offline
    Bingo Beer Addict
    OK, vérifie bien quand même parce que je suis pas sûr d'avoir compris ce que tu voulais comme résutat (ne sachant pas ce que signifient exactement les champs, c'est pas évident).
    Bingo, 2 Novembre 2006
    #38
  19. Offline
    k o D Belge !
    J'ai fait pas mal de test et çà passe comme il faut.
    Mais bon j'en ferai encore évidemment :)
    k o D, 2 Novembre 2006
    #39
  20. Offline
    Bingo Beer Addict
    OK, tant mieux. Les "UNION" c'est pas hyper recommandé, alors quand on peut s'en passer c'est mieux.
    Bingo, 2 Novembre 2006
    #40
Statut de la discussion:
Fermée.