2010-06-24 5 views
0

j'ai deux tables un des critères utilisateurs:SQL Compliqué requête de jointure

id  int(11)  NO PRI  NULL auto_increment 
membership_type  tinyint(3) unsigned  NO MUL  NULL  
username varchar(16)  NO  NULL  
password char(40) NO  NULL  
email varchar(100) NO  NULL  
firstname varchar(40)  NO  NULL  
lastname varchar(40)  NO  NULL  
company  varchar(120) NO  NULL  
birthday date NO  NULL  
country  smallint(5) unsigned NO  NULL  
city smallint(5)  NO  NULL  
address  varchar(200) NO  NULL  
landphone char(10) NO  NULL  
mobilephone  char(10) NO  NULL  
website  varchar(150) NO  NULL  
feedback_score tinyint(4) NO  NULL  
created  datetime NO  NULL  
last_login datetime NO  NULL  
last_ip  varchar(15)  NO  NULL  

nom d'un autre est user_cache:

user_id  int(11)  NO MUL  NULL  
cache_type int(50)  NO  NULL  
value varchar(100) NO  NULL  

Je veux sélectionner les données utilisateur (membre, nom d'utilisateur, prénom, nom, etc.) et sélectionnez les données de cache de l'utilisateur associé (sélectionnez * à partir de user_cache où user_id = X). Je sélectionne l'utilisateur avec une simple requête sql puis j'utilise une autre requête sql pour obtenir les détails du cache. Je souhaite joindre des requêtes dans une requête. Est-ce possible ?

Répondre

5
select u.*, uc.* 
from users as u 
left join user_cache as uc 
    on u.id = uc.user_id 

Vous obtiendrez toutes les informations utilisateur pour chaque ligne de données de user_cache et si un utilisateur n'a pas de données de user_cache, vous obtiendrez les données des valeurs NULL de user_cache.

+0

En effet, c'est ce que j'écrivais aussi, je ne pouvais pas voir pourquoi cela est compliqué, c'est un 'état JOIN' très simple. – Kezzer

0

Peut-être que je ne comprends pas votre question, mais la requête suivante doit retourner ce dont vous avez besoin:

SELECT u.membership_type, u.firstname, ..., uc.* 
FROM users u 
LEFT JOIN user_cache uc 
ON u.id = uc.user_id; 
+0

C'est une jointure interne; Si un utilisateur n'a pas d'entrée dans la table 'USER_CACHE' - il ne sera pas dans le resultset, c'est pourquoi vous voulez utiliser une jointure OUTER. –

+0

Vous avez raison. Fixé. – ryanprayogo

1

Je suppose que cela pourrait fonctionner?

SELECT u.*, uc.* 
FROM user u 
    left join user_cache uc ON uc.user_id = u.id