Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
564 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Requête sur 2 tables un peu tordue

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Requête sur 2 tables un peu tordue

n°1176007
*LighTninG​*
Posté le 14-08-2005 à 15:53:43  profilanswer
 

Bonjour à tous ! Je dois faire une requête sur 2 tables qui se présentent comme ceci:
 
- Table 1:

Code :
  1. App_id | User_id
  2. -------|---------
  3. 1      | 1
  4. 1      | 2
  5. 1      | 3
  6. 1      | 4
  7. 1      | 5


- Table 2:

Code :
  1. App_id | User_id
  2. -------|---------
  3. 2      | 3
  4. 2      | 4
  5. 2      | 5
  6. 2      | 6
  7. 2      | 7


Je voudrais récupérer les users qui ont l'app 1 et l'app 2, en l'occurrence ici les users 3,4,5, de manière à obtenir ça:

Code :
  1. App_id | User_id
  2. -------|---------
  3. 1      | 3
  4. 2      | 3
  5. 1      | 4
  6. 2      | 4
  7. 1      | 5
  8. 2      | 5


Et surtout pas:

Code :
  1. User_id
  2. -------
  3. 3   
  4. 4     
  5. 5


Cela fait un moment que je galère à trouver la bonne requête et tout ce que j'arrive à obtenir c'est justement ce que je ne veux pas...

Code :
  1. SELECT App_id, User_id FROM table1,table2 WHERE table1.user_id=table2.user_id


 
Je vous remercie d'avance pour votre aide !


Message édité par *LighTninG* le 14-08-2005 à 15:57:15
mood
Publicité
Posté le 14-08-2005 à 15:53:43  profilanswer
 

n°1176008
kalex
Posté le 14-08-2005 à 15:58:41  profilanswer
 

Pourquoi tu as aussi une colonne App_id dans table1 ? C'est pas logique.

n°1176009
*LighTninG​*
Posté le 14-08-2005 à 15:59:48  profilanswer
 

Si je t'assure ça se présente comme ça...

n°1176011
betsamee
Asterisk Zeperyl
Posté le 14-08-2005 à 16:04:02  profilanswer
 

Code :
  1. select App_id ,User_id
  2. from Table1
  3. where App_id in(select App_id  from Table2)
  4. UNION
  5. select App_id ,User_id
  6. from Table2
  7. where App_id in(select App_id  from Table1)

n°1176013
kalex
Posté le 14-08-2005 à 16:05:28  profilanswer
 

Citation :

Si je t'assure ça se présente comme ça...


Il faut sûrement commencer par revoir ça. Une seule table devrait suffire.


Message édité par kalex le 14-08-2005 à 16:06:01
n°1176019
*LighTninG​*
Posté le 14-08-2005 à 16:18:15  profilanswer
 

Ok merci beaucoup betsamee c'est bien ça que voulais savoir :)
Mais je crois que ça va être dur à adapter à mon code ... Je m'explique:
 
En fait kalex au départ je n'ai effectivement qu'une seule table:
 
- Table:

Code :
  1. App_id | User_id
  2. -------|---------
  3. 1      | 1
  4. 2      | 1
  5. 1      | 2
  6. 1      | 3
  7. 2      | 3
  8. 2      | 4
  9. 1      | 5
  10. 2      | 5


Le but final c'est d'obtenir ça, c'est à dire les users qui ont app1 et app2:
 
- Résultat:

Code :
  1. App_id | User_id
  2. -------|---------
  3. 1      | 1
  4. 2      | 1
  5. 1      | 3
  6. 2      | 3
  7. 1      | 5
  8. 2      | 5


C'est pour ça que j'avais d'abord commencé par en extraire 2 tables (comme j'ai posté au début du sujet) et je pensais pouvoir unifier les 2 simplement... mais je pense que ca devient compliqué et j'aimerais savoir s'il y a une autre possibilité. Qu'en pensez-vous?


Message édité par *LighTninG* le 14-08-2005 à 16:18:54
n°1176024
betsamee
Asterisk Zeperyl
Posté le 14-08-2005 à 16:25:45  profilanswer
 

Code :
  1. select App_id ,User_id
  2. from Table
  3. Having count(User_id )>1


Message édité par betsamee le 14-08-2005 à 16:26:08
n°1176027
kalex
Posté le 14-08-2005 à 16:34:07  profilanswer
 

Ou :

Code :
  1. SELECT T1.User_id FROM table T1
  2. JOIN table T2
  3. WHERE T1.App_id = 1 AND T2.App_id = 2 AND T1.User_id = T2.User_id;


Message édité par kalex le 14-08-2005 à 16:34:54
n°1176029
betsamee
Asterisk Zeperyl
Posté le 14-08-2005 à 16:38:45  profilanswer
 

ma seconde reponse est fausse
 
petite reponse pas du tout optimale:
 

Code :
  1. SELECT App_id ,User_id 
  2. FROM table1
  3. WHERE User_id IN (SELECT User_id FROM table1 WHERE App_id=1) AND User_id IN (SELECT User_id FROM table1 WHERE App_id=2)

n°1176031
Beegee
Posté le 14-08-2005 à 16:42:48  profilanswer
 

Sinon peut-être comme ça :
 

Code :
  1. SELECT t1.App_id, t1.User_id 
  2. FROM table1 t1, table1 t2
  3. WHERE t1.User_id = t2.User_id
  4. AND t1.App_id IN (1, 2)
  5. AND t2.App_id IN (1, 2)
  6. AND t1.App_id <> t2.App_id;

mood
Publicité
Posté le 14-08-2005 à 16:42:48  profilanswer
 

n°1176033
kalex
Posté le 14-08-2005 à 16:43:33  profilanswer
 

betsamee a écrit :

ma seconde reponse est fausse
 
petite reponse pas du tout optimale:
 

Code :
  1. SELECT App_id ,User_id 
  2. FROM table1
  3. WHERE User_id IN (SELECT User_id FROM table1 WHERE App_id=1) AND User_id IN (SELECT User_id FROM table1 WHERE App_id=2)


Ca c'est pour MySQL 5, je me trompe ?

n°1176037
betsamee
Asterisk Zeperyl
Posté le 14-08-2005 à 16:45:57  profilanswer
 

teste avec mysql 5
mais ca marche a partir de 4.1.X a mon avis

n°1176045
*LighTninG​*
Posté le 14-08-2005 à 17:18:03  profilanswer
 

D'abord merci à tous pour vos suggestions :D J'ai testé vos requêtes sous phpmyadmin et voila ce  que ça me donne:
 
kalex ->

Citation :

SELECT T1.User_id, T1.app_id FROM table T1
JOIN table T2
WHERE T1.App_id = 1 AND T2.App_id = 2 AND T1.User_id = T2.User_id;


Alors les user_id renvoyés sont les bons, mais par contre il ne me liste pas les app_id pour chaque user_id
 
Il m'affiche:
User_id=1  , App_id =1
 
au lieu de:  
User_id=1  , App_id =1
User_id=1  , App_id =2
 
betsamee ->

Citation :

SELECT App_id ,User_id FROM table1
WHERE User_id IN (SELECT User_id FROM table1 WHERE App_id=1) AND User_id IN (SELECT User_id FROM table1 WHERE App_id=2)


Ta requête fonctionne presque comme je le voudrais, mais comme le nombre d'app ne se limite pas à 2 (c'est à dire que app_id va de 1 à x) un autre problème se pose.
Pour les utilisateurs qui ont les app1, app2 et plus ça me renvoit ça:

Code :
  1. User_id | App_id
  2. --------|--------
  3. 1       |      1
  4. 1       |      2
  5. 2       |      1
  6. 2       |      2
  7. 2       |      3
  8. 2       |      4
  9. 3       |      1
  10. 3       |      2
  11. 3       |      3
  12. 4       |      1
  13. 4       |      2


 
Beegee ->

Citation :

SELECT t1.App_id, t1.User_id    
FROM table1 t1, table1 t2
WHERE t1.User_id = t2.User_id
AND t1.App_id IN (1, 2)
AND t2.App_id IN (1, 2)
AND t1.App_id <> t2.App_id;


Oui c'est tout à fait ça qu'il me faut! :) Par contre j'ai essayé de l'adapter à une recherche sur 3 app_id, donc pour les users qui ont app_id=1, app_id=2 et app_id=3 (parce qu'au final ca doit fonctionner sur x app_id) j'y suis pas arrivé, je n'arrive pas à filtrer correctement les résultats :( T'as pas une idée?
 
Encore merci en tout cas pour votre réactivité :)


Message édité par *LighTninG* le 14-08-2005 à 17:19:25
n°1176047
kalex
Posté le 14-08-2005 à 17:24:04  profilanswer
 

*LighTninG* a écrit :

D'abord merci à tous pour vos suggestions :D J'ai testé vos requêtes sous phpmyadmin et voila ce  que ça me donne:
 
kalex ->

Citation :

SELECT T1.User_id, T1.app_id FROM table T1
JOIN table T2
WHERE T1.App_id = 1 AND T2.App_id = 2 AND T1.User_id = T2.User_id;


Alors les user_id renvoyés sont les bons, mais par contre il ne me liste pas les app_id pour chaque user_id
 
Il m'affiche:
User_id=1  , App_id =1
 
au lieu de:  
User_id=1  , App_id =1
User_id=1  , App_id =2

Les app_id, tu les connais déjà puisque tu les donnes dans la requête. Pourquoi faire des transferts inutiles ?

n°1176059
Beegee
Posté le 14-08-2005 à 17:40:26  profilanswer
 

tout à fait, de toute façon, avec mySql ancienne version, pas de sous-requête donc on peut juste récupérer les User_id, avec le GROUP BY (...) HAVING COUNT(*) = X;

n°1176085
*LighTninG​*
Posté le 14-08-2005 à 18:51:49  profilanswer
 

kalex -> Et bien en fait j'ai d'autres colonnes dans ces tables et pour que je puisse y accèder ensuite il me faut les app_id obligatoirement...
 
Sinon beegee tu pourras pas m'aider à adapter ta requête sur 3 app_id? pliz :)
Il doit me manquer une condition car j'ai des doublons qui apparaissent...

Code :
  1. SELECT t1.App_id, t1.User_id 
  2. FROM table t1, table  t2,table  t3
  3. WHERE t1.User_id = t2.User_id
  4. AND t1.User_id = t3.User_id
  5. AND t2.User_id = t3.User_id
  6. AND t1.App_id IN (1,2,3)
  7. AND t2.App_id IN (1,2,3)
  8. AND t3.App_id IN (1,2,3)
  9. AND t1.App_id <> t2.App_id
  10. AND t1.App_id <> t3.App_id
  11. AND t2.App_id <> t3.App_id


Message édité par *LighTninG* le 14-08-2005 à 19:27:06
n°1176103
kalex
Posté le 14-08-2005 à 19:36:09  profilanswer
 

Ou alors, tu fais deux requêtes au lieu de transformer ton code en champ de bataille... ;)
En plus, ça t'éviteras de transférer plusieurs fois les mêmes données.

n°1176109
*LighTninG​*
Posté le 14-08-2005 à 19:40:43  profilanswer
 

Oui c'est sûr je préférerais aller au plus simple :p 2 requêtes ok, mais lesquelles? :pt1cable:


Message édité par *LighTninG* le 14-08-2005 à 21:13:10
n°1176346
Beegee
Posté le 15-08-2005 à 01:20:11  profilanswer
 

Code :
  1. SELECT User_id, COUNT(App_id)
  2. FROM table1
  3. WHERE App_id IN (<ta liste> )
  4. GROUP BY User_id
  5. HAVING COUNT(App_id) = <le nombre de App_id dans ta liste>

n°1176639
*LighTninG​*
Posté le 15-08-2005 à 19:12:14  profilanswer
 

Bon et bien merci beaucoup à vous 3:p Voila les requêtes qui vont me servir finalement pour ma fonction de recherche.
 
- Celle de betsamee (avec laquelle j'ai fini par obtenir tout à fait ce que je voulais)

Code :
  1. SELECT App_id ,User_id FROM table
  2. WHERE User_id IN (SELECT User_id FROM table WHERE App_id=1)
  3. AND User_id IN (SELECT User_id FROM table WHERE Appli_id=2)
  4. AND User_id IN (SELECT User_id FROM table WHERE App_id=3)
  5. AND (app_id='1' or app_id='2' or app_id='3')


 
- Et la dernière de Beegee

Code :
  1. SELECT User_id
  2. FROM table
  3. WHERE App_id IN (1,2,3)
  4. GROUP BY User_id
  5. HAVING COUNT(App_id) = '3'


 
Merci encore :hello:  

n°1176717
Beegee
Posté le 15-08-2005 à 22:05:57  profilanswer
 

enlève les guillemets pour les nombres : '3' => 3.

n°1176924
*LighTninG​*
Posté le 16-08-2005 à 10:58:33  profilanswer
 

Ok merci du conseil !

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Requête sur 2 tables un peu tordue

 

Sujets relatifs
Comment faire pour lancer un script à une date donnée sur MYSQL???Galerie photos avec mysql ?
[résolu]Probleme PHP/Mysql bizzarreComparer deux tables sous Mysql
[RESOLU][MYSQL] Besoin d'aide pour une requete[MySQL]cardinalité 1,n -- 1,n et clé étrangere
[MySQL] Empêcher accès aux bases de données ...[RESOLU] -> [FMX/MySQL] GET ou POST??
Plus de sujets relatifs à : [MySQL] Requête sur 2 tables un peu tordue


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR