2010-11-22 7 views
6

Tengo 2 tablas llamadas user y userFriend. Quiero que todos los usuarios de la tabla de usuario y el miembro específico de la tabla userFriend. Entonces me quiero unir a ambos ...cómo escribir la combinación izquierda condicional

user 
userID userName 
1   aaa 
2   bbb 
3   ccc 
4   ddd 
5   eee 

userFriend 
userFriendID userID friendUserID 
1    1  2 
2    2  3 
3    1  4 
4    4  2 

Así que si mi ID de usuario = 1, entonces quiero resultado como

userID userName userFriendID friendUserID  
2   bbb  1   2 
3   ccc  NULL  NULL 
4   ddd  3   4 
5   eee  NULL  NULL 

así de esta manera quiero condicional de segunda mesa, solo quiero unirme a la segunda tabla que tenga ID de usuario = 1 con la 1ra tabla usando combinación izquierda.

+0

Podría diseñar su código un poco mejor (use la ayuda de formateo). En este momento, parece que tiene userID, userFriendID y friendUserID, mientras que creo que solo necesita dos ID. – Gidon

+0

¿Podría publicar su modelo de datos? Creo que tal solicitud implica que hay un problema allí. –

+0

echa un vistazo a http://stackoverflow.com/questions/1255492/conditional-join-in-mysql – Singleton

Respuesta

0

Para lo que quiere, no necesita una consulta de ambas tablas. El solo uso de userFriend le dará los datos. Necesitará la tabla de usuario solo para nombres.

SELECT DISTINCT userID FROM userFriend 
WHERE friendUserID = ? 

esto le dará a todos los usuarios que tienen ese amigo específico que necesita. Opcionalmente se puede añadir un INNER JOIN para ver cuáles son los nombres:

SELECT DISTINCT f.userID, u.name 
FROM userFriend f 
INNER JOIN users u ON u.userID = f.userID 
WHERE friendUserID = ? 

ACTUALIZACIÓN Un comentario acerca de su estructura. No necesita el userFriendID. La combinación de ID de usuario e ID de amigo puede ser su clave.

actualización de la consulta

SELECT * FROM users u 
LEFT JOIN userFriend f on u.userID = f.userID 
WHERE f.friendUserID = ? 

Esto le devolverá todos los usuarios que tienen el amigo X. La combinación izquierda no es importante en esta consulta. Esta condición específica lo está volviendo irrelevante.

Para obtener exactamente lo que necesita, necesita ejecutar esto.

SELECT * FROM users u 
LEFT JOIN (
    SELECT DISTINCT * FROM userFriend f 
    WHERE friendID = 4 
) x ON u.id = x.userId 

Se puede hacer uso de una subconsulta, pero no creo que es la forma más lógica de la organización de sus mesas.

4

Es algo poco convencional que pedir ... pero esto le da los resultados que desea.

SELECT u.userID, u.userName, uf.userFriendID, uf.friendUserID 
FROM user u 
LEFT JOIN userFriend uf ON u.userID = uf.friendUserID AND uf.userID =1 
WHERE u.userID !=1 
Cuestiones relacionadas