[MYSQL5] Selection si pas déjà dans une autre table [updated]

Selection si pas déjà dans une autre table [updated] [MYSQL5] - SQL/NoSQL - Programmation

Marsh Posté le 20-04-2006 à 00:59:35    

:hello:  :hello:  
Salut,
 
Je coince sur un truc surement très con [:mir45] , en fait disons que je veux selectionner tous les magasins, sauf ceux déjà enregistrés dans une table.
 
Exemple :
J'ai une table magasins, et une autre user2magasin, je veux selectionner tous les membres qui ne sont pas dans la table user2magasin.
 
J'ai donc essayer not like et bien d'autres encores mais rien n'y fait, j'arrive a rien  [:wawash]  
 
Uné idée ?
 
Voici mon code actuel (Qui renvoit des doublons en faite :/ )

Code :
  1. SELECT `magasins`.`id_magasin`, `magasins`.`nom`
  2. FROM magasins, users2magasins
  3. WHERE ((`users2magasins`.`id_user` not like '2') AND (`users2magasins`.`id_magasin` not like `magasins`.`id_magasin`))
  4. ORDER BY `magasins`.`nom` ASC


Message édité par KdZ' le 09-05-2006 à 15:19:28
Reply

Marsh Posté le 20-04-2006 à 00:59:35   

Reply

Marsh Posté le 20-04-2006 à 01:10:24    

Code :
  1. select id_magasin FROM magasins MINUS select id_magasin FROM user2magasin


 
Si tu n'a pas le MINUS, tu peux faire une jointure externe, et récupéré tous les magasins dont la résultat de la jointure est nul (minus mysql dans google doit donner des exemples)


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 20-04-2006 à 01:20:43    

Merci, je check de suite :)
Je n'ai en revanche rien touvé sur la doc mysql pour minus :eek:


Message édité par KdZ' le 20-04-2006 à 01:26:19
Reply

Marsh Posté le 20-04-2006 à 01:25:59    

J'en suis là :

Code :
  1. SELECT `magasins`.`id_magasin`, `magasins`.`nom`
  2. FROM magasins
  3. MINUS (select * from `users2magasins` where `users2magasins`.`id_user`=2 and `users2magasins`.`id_magasin`=`magasins`.`id_magasin`)
  4. ORDER BY `magasins`.`nom` ASC


 
Edit : Et voila :) Merci pour tous ;)
 

Code :
  1. SELECT `magasins`.`id_magasin`, `magasins`.`nom`
  2. FROM `magasins`
  3. WHERE NOT EXISTS ( select `id_user2magasin` from `users2magasins` where `users2magasins`.`id_user`=2 and `users2magasins`.`id_magasin`=`magasins`.`id_magasin`)
  4. ORDER BY `magasins`.`nom` ASC


    [:must]  
 
ps : Ceci dit, je n'ai pas réussi à faire fonctionner le MINUS :/


Message édité par KdZ' le 20-04-2006 à 01:44:01
Reply

Marsh Posté le 20-04-2006 à 16:41:47    

bah, apparament, il n'y a pas encore MINUS sur Mysql (sur d'autre SGBD je crois que si)
http://mysql.developpez.com/faq/?p [...] ITE_except
http://forums.mysql.com/read.php?61,22323,22323


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 20-04-2006 à 16:52:48    

MINUS existe sur Oracle mais pas sur MySQL. Mais un NOT EXISTS peut le remplacer tout aussi facilement

Reply

Marsh Posté le 20-04-2006 à 16:56:48    

Apparemment Oui (et je répond à vous deux) :)

Reply

Marsh Posté le 09-05-2006 à 15:19:11    

Ah les boules, ma requete ne fonctionne pas sous mysql4.0 :(
 
Pourtant NOT EXISTS est bien présent dans la doc de cette version, une idée ?
 
Erreur de syntaxe près de 'EXISTS ( select `id_user2magasin` from `users2magasins` where `u' à la ligne 1


Message édité par KdZ' le 09-05-2006 à 15:21:11
Reply

Marsh Posté le 09-05-2006 à 15:55:14    

ta sous requête renvoie plus d'une valeur ?

Reply

Marsh Posté le 09-05-2006 à 18:05:58    

Comment ça ?

Reply

Marsh Posté le 09-05-2006 à 18:05:58   

Reply

Marsh Posté le 09-05-2006 à 23:11:10    

Tu veux renvoyer les magasins dont l'id est dans la table "magasins" mais pas dans la table "users2magasins :??:
 

Code :
  1. SELECT magasins.*
  2. FROM magasins
  3. WHERE id NOT IN (
  4.     SELECT id_magasin FROM users2magasins
  5. )

[:proy]

Reply

Marsh Posté le 10-05-2006 à 00:58:56    

Ah pas mal, j'ai donc fait :
 

Code :
  1. SELECT magasins.*
  2. FROM magasins
  3. WHERE id_magasin NOT IN (
  4.     SELECT id_magasin FROM users2magasins
  5. )


 
Mais sous MySQL 4.0.20-standard j'ai #1064 - Erreur de syntaxe près de 'SELECT id_magasin FROM users2magasins  )
LIMIT 0, 30' à la ligne 1

 
C'est fou ça, pourtant ça devrait fonctionner à en croire la doc  :??:  :pfff:
 
Edit :Alors qu'en local (win5.1,php5.1,mysql5.0,apache2) ça fonctionne :(

Message cité 1 fois
Message édité par KdZ' le 10-05-2006 à 01:04:31
Reply

Marsh Posté le 10-05-2006 à 12:47:20    

up please

Reply

Marsh Posté le 10-05-2006 à 13:15:43    

essaye ça
http://dev.mysql.com/doc/refman/5. [...] eries.html
 
En plus, EXISTS est plus perfs que IN si je ne m'abuse. :)

Reply

Marsh Posté le 10-05-2006 à 13:49:05    

ca dépend des cas et des volumétries de table, tu peux avoir un EXIST meilleur qu'un IN dans un cas particulier et le contraire dans un autre.
 
le meilleur moyen de savoir : tester ;)

Reply

Marsh Posté le 10-05-2006 à 14:11:16    

Déjà essayé (vous lisez pas ou quoi) mais marche pas.

Reply

Marsh Posté le 10-05-2006 à 14:26:25    

bon, j'ai essayer de faire comme dans la doc, mais rien n'y fait.
 
SELECT DISTINCT magasins.id_magasin FROM magasins
  WHERE NOT in (SELECT * FROM magasins  
                    WHERE magasins.id_magasin = users2magasins.id_magasin);
 
C'est possible que ça vienne de la config de mysql ?

Reply

Marsh Posté le 10-05-2006 à 17:17:18    

Ca, c'est normal, la requête est pas bonne. Il faut lui dire ce qu'il doit rechercher dans la sous-requête [:proy]

Reply

Marsh Posté le 10-05-2006 à 17:33:03    

KdZ' a écrit :

Ah pas mal, j'ai donc fait :
 

Code :
  1. SELECT magasins.*
  2. FROM magasins
  3. WHERE id_magasin NOT IN (
  4.     SELECT id_magasin FROM users2magasins
  5. )


 
Mais sous MySQL 4.0.20-standard j'ai #1064 - Erreur de syntaxe près de 'SELECT id_magasin FROM users2magasins  )
LIMIT 0, 30' à la ligne 1

 
C'est fou ça, pourtant ça devrait fonctionner à en croire la doc  :??:  :pfff:
 
Edit :Alors qu'en local (win5.1,php5.1,mysql5.0,apache2) ça fonctionne :(


 
Alors si j'ai bien compris, tu as une BDD locale mysql 5. Tout fonctionne.
Tu as une BDD distante mysql 4. Ca ne marche pas.
 
Utilise-tu bien les même requêtes pour tes deux tests car quand je vois ça j'ai un gros doute :
 

Citation :

Mais sous MySQL 4.0.20-standard j'ai #1064 - Erreur de syntaxe près de 'SELECT id_magasin FROM users2magasins  )
LIMIT 0, 30' à la ligne 1


 
et deux posts plus bas haut
 

Citation :

Erreur de syntaxe près de 'EXISTS ( select `id_user2magasin` from `users2magasins` where `u' à la ligne 1


 
Tu n'aurais pas un problème de nommage de tes champs par hasard ?
Tes BDD sont identiques ?
Tu les a repliqué à la main ?


Message édité par jeoff le 10-05-2006 à 17:36:10
Reply

Marsh Posté le 10-05-2006 à 18:01:17    

J'ai fait un export compatible mysql4.0 phpmyadmin.
Tout c'est bien passé et les relations sont bien là.
 
Je refait un test avec la même requete pour les deux bases de suite...
mais je suis sur de l'avoir déjà fait, je n'y comprend rien.
 
Bon a tout de suite
 
Edit : Bon voila, j'ai bien vérifié, toutes les tables sont là, les données aussi.
Et avec la même requete qui fonctionne en local mysql5.0 :

Code :
  1. SELECT `magasins`.`id_magasin` , `magasins`.`nom`
  2. FROM `magasins`
  3. WHERE NOT
  4. EXISTS (
  5. SELECT `id_user2magasin`
  6. FROM `users2magasins`
  7. WHERE `users2magasins`.`id_user` =1
  8. AND `users2magasins`.`id_magasin` = `magasins`.`id_magasin`
  9. )
  10. ORDER BY `magasins`.`nom` ASC


 
rien n'y fait pour mysql4.0 :(
#1064 - Erreur de syntaxe près de 'EXISTS ( select `id_user2magasin` from `users2magasins` where `u' à la ligne 1


Message édité par KdZ' le 10-05-2006 à 18:08:40
Reply

Marsh Posté le 10-05-2006 à 18:57:22    

Tiens, je viens de m'apercevoir que l'export/import a oublié les auto increment :/
 
Tout est ok et identique mais idem :(

Reply

Marsh Posté le 10-05-2006 à 19:00:02    

la sous requête à part fonctionne ?
mysql 4.0 supporte les sous requêtes ?

Reply

Marsh Posté le 10-05-2006 à 22:32:31    

Oui mais en rajoutant from magasins bien sur


Message édité par KdZ' le 10-05-2006 à 22:36:01
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed