2010-03-23 10 views
6

tengo una mesa de edad así:cómo unirse a las tablas de MySQL

user> id | name | address | comments 

Y ahora tengo que crear una tabla de "alias" para permitir que algunos usuarios tengan un nombre de alias por algunas razones. He creado una nueva tabla 'User_Alias' como esto:

user_alias> name | user 

Pero ahora tengo un problema debido a mi pobre nivel de SQL ... ¿Cómo se unen las dos tablas para generar algo como esto:

1 | my_name | my_address | my_comments 
1 | my_alias | my_address | my_comments 
2 | other_name | other_address | other_comments 

es decir, yo quiero hacer una consulta "SELECT ..." que devuelve en el mismo formato que la tabla "usuario" todos los usuarios y alias .. Algo como esto:

SELECT user.* FROM user LEFT JOIN user_alias ON `user`=`id` 

pero doesn no funciona para mí ..

Respuesta

2

Algo así como

SELECT user.name, user.address, user.comment FROM user 
UNION ALL 
SELECT user_alias.alias, user.address, user.comment 
    FROM user INNER JOIN user_alias on user.name = user_alias.name 
ORDER BY name 

le acercarán a lo que desea.

Necesita UNION dos SELECT juntos porque la solución LEFT JOIN propuesta por otros incluirá solo una fila en el conjunto de resultados para usuarios con alias, no dos como se especifica en su pregunta.

Pero debe hacer que la columna común se una al usuario y alias a la columna de identificación, no a la columna de nombre.

+0

¡Perfecto! Esta es la solución. No sé si esto es lo mejor, ¡pero funciona! Sólo un pequeño error: user.name SELECT, user.address, user.comment DE usuario UNION ALL SELECT user_alias.alias, user.address, user.comment DE usuario combinación interna User_Alias ​​en user.id = User_Alias. usuario PEDIDO POR nombre – Ivan

+0

Oh, veo su UNIDO ahora. Debe cambiar el nombre user_alias.user a user_alias.user_id para que quede más claro lo que está sucediendo. –

3

Creo que se necesita algo como esto:

SELECT user.* 
FROM user 
LEFT JOIN user_alias 
ON user.name=user_alias.name 

su búsqueda original no era lo suficientemente específico en la condición de unión.

+0

Esto produce solo una fila para id = 1, no dos como se solicita. –

+0

Sí, no funciona .. – Ivan

+0

Ivan, mira mi respuesta a continuación. –

2
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name 
0

En primer lugar - la consulta que desea construir no es trivial, ya que están tratando de conseguir algunos resultados se extendieron a través de más de una fila. Así que le ofreceré una solución adecuada de la manera que debería (lea: de alguna manera, un desarrollador de bases de datos hará esto :-).

En primer lugar, debe modificar su tabla user_alias para que contenga la columna id pero no el nombre. No es buena idea unir sus tablas usando el campo name. La razón de esto es que podría haber dos Sarah Connors.

A continuación, se pueden obtener resultados de ambas tablas usando esta consulta:

SELECT user.*, user_alias.* 
FROM user LEFT JOIN user_alias 
ON user.id=user_alias.id 

De esta manera se consigue sus resultados en tal formato:

id | name   | address  | comments | user 
------------------------------------------------------------- 
1 | Sarah Connor | Planet Earth | Nice woman | sarah_connor 
2 | Sarah Connor | USA, NY  | Mean woman | sarah_c 
3 | John Connor | USA, NY  | n00b  | john123 

En las situaciones en las que hay dos o más registros en la tabla user_alias para la misma persona (igual id), obtendrá algo como esto:

id | name   | address  | comments | user 
------------------------------------------------------------- 
4 | Bill Clinton | White House | President | bill 
4 | Bill Clinton | White House | President | monica 
+0

El problema es que en situaciones en las que solo hay un alias en el archivo, devolverá solo una fila en el conjunto de resultados. Pero el OP quiere que se devuelvan dos filas (la fila del usuario y una fila separada que combina el alias de user_alias con la dirección y el comentario de la fila del usuario coincidente). –

+0

De manera más general, el problema es que cuando hay alias en el archivo, no devolverá la fila original sin asignar de la tabla de usuarios. –

Cuestiones relacionadas