¡ Buenas a todos !
Tengo un problema con una consulta SQL.
Tampoco sabia muy bien en que parte del foro debia iniciar este tema...por eso lo pongo en dudas generales.
El problema es el siguiente: Tengo 2 tablas con una relacion reflexiva (usuario<->usuarioAmigos). La tabla usuario(idUsuario, nombre) y la tabla usuarioAmigos (idUsuario, idAmigo). Tengo que hacer una consulta que me muestre las siguientes columnas (idUsuario, nombreUsuario, idAmigo, nombreAmigo).
El problema lo tengo con los datos de la columna nombreAmigo...idUsario, nombreUsuario y idAmigo los saco correctamente, pero en la columna nombreAmigo me saca los datos de la columna nombreUsuario....
Llevo 2 dias con este ejercicio y no soy capaz de sacarlo...Esto es lo que tengo hecho:
select usuario.idusuario, usuario.nombreapellidos, usuarioamigos.idamigo, usuario.nombreapellidos from usuario
inner join usuarioamigos on usuario.idusuario=usuarioamigos.idusuario
where usuario.nombreapellidos in(
select usuario.nombreapellidos from usuario
inner join usuarioamigos on usuario.idusuario=usuarioamigos.idamigo
)
order by usuario.idusuario
La salida de la consula es esta:
Citar
idusuario nombreUsuario idamigo nombreAmigo
1 nombreapellidos1 2 nombreapellidos1
1 nombreapellidos1 3 nombreapellidos1
1 nombreapellidos1 5 nombreapellidos1
1 nombreapellidos1 6 nombreapellidos1
2 nombreapellidos2 1 nombreapellidos2
2 nombreapellidos2 3 nombreapellidos2
2 nombreapellidos2 4 nombreapellidos2
¿Alguien sabe como hacer un alias o algo parecido en la columna nombre del amigo para que la distinga de la columna nombre del usuario?
Muchas gracias, un saludo.
Te saca bien los valores pero el nombre de la columna es lo que te saca mal?
Porque no utilizas AS
Algo como:
SELECT nombreAmigo AS LoQueQuieras, .... FROM ....
Salu2s
Buenas DarK_FirefoX
He reeditado la la 1º publicación para que quede mas claro. Mi problema no esta en el nombre de la columna. Mi problema esta en los datos de las columnas, porque tengo esta salida:
Citar
idusuario nombreUsuario idamigo nombreAmigo
1 nombreapellidos1 2 nombreapellidos1
1 nombreapellidos1 3 nombreapellidos1
1 nombreapellidos1 5 nombreapellidos1
1 nombreapellidos1 6 nombreapellidos1
2 nombreapellidos2 1 nombreapellidos2
2 nombreapellidos2 3 nombreapellidos2
2 nombreapellidos2 4 nombreapellidos2
..... .....
Y quiero que me salga esta salida:
Citar
idusuario nombreUsuario idamigo nombreAmigo
1 nombreapellidos1 2 nombreapellidos2
1 nombreapellidos1 3 nombreapellidos3
1 nombreapellidos1 5 nombreapellidos5
1 nombreapellidos1 6 nombreapellidos6
2 nombreapellidos2 1 nombreapellidos1
2 nombreapellidos2 3 nombreapellidos3
2 nombreapellidos2 4 nombreapellidos4
..... .....
Si te fijas en los datos de la columna nombreAmigo no salen bien porque los nombres de la columna nombreAmigo no se corresponde con el idAmigo...
Puedes explicar el significado semántico de tu consulta? O sea, como tal, de acuerdo a tus valores que es lo que quieres realmente hacer con la consulta?
Salu2s
Como indicas, debes utilizar un alias para volver a utilizar de nuevo la tabla usuario y poder enlazar otra vez. Si no he interpretado mal, podría quedar así:
SELECT usuario.idusuario, usuario.nombreapellidos as nombreusuario, usuarioamigos.idamigo, usuario2.nombreapellidos AS nombreamigo
FROM (usuario INNER JOIN usuarioamigos ON usuario.idusuario= usuarioamigos.idusuario)
INNER JOIN usuario usuario2 ON usuarioamigos.idamigo = usuario2.idusuario
ORDER BY usuario.idusuario,usuarioamigos.idamigo
Si se requiere utilizar una tabla, dos o más veces dentro de una misma consulta, debes agregarle alias ya que si no lo haces, hace cosas muy raras!
De igual manera, si se requiere utilizar un mismo campo 2 o más veces, también debes agregar alias!
CitarPublicado por: DarK_FirefoX
Insertar Cita
Puedes explicar el significado semántico de tu consulta? O sea, como tal, de acuerdo a tus valores que es lo que quieres realmente hacer con la consulta?
Salu2s
Semánticamente lo que quiero hacer es sacar una lista con todos los usuarios y sus amigos asociados. Las tablas que tengo son: usuario(idusuario,nombreapellidos) y usuarioamigos(idusuario,idamigo). Y el resultado que debe sacar es el siguiente:
Citar
nombreapellidos nombreapellidos
luis juan
luis pedro
luis mario
juan luis
juan pedro
juan mario
He probado a poner alias en la columna nombreapellidos que es la que necesito repetir pero me da un error...
Esta es la consulta que hago.
select usuario.nombreapellidos, usuario.nombreapellidos as nombreAmigo from usuario
inner join usuarioamigos on usuario.idusuario=usuarioamigos.idusuario
where nombreAmigo in(
select nombreAmigo from usuario
inner join usuarioamigos on usuario.idusuario=usuarioamigos.idamigo
)
order by usuario.idusuario
Y el error que me da esta consulta en mysql es:
Citar#1054 - Unknown column 'nombreAmigo' in 'IN/ALL/ANY subquery'
¿Alguna idea?
AL FIN DI CON LA RESPUESTA!! jeje
La consulta que queria hacer es la siguiente:
select T1.idusuario, T1.nombreapellidos, usuarioamigos.idamigo, T2.nombreapellidos from usuarioamigos
inner join usuario as T1 on usuarioamigos.idusuario=T1.idusuario
inner join usuario as T2 on usuarioamigos.idamigo=T2.idusuario
order by T1.idusuario, usuarioamigos
Muchas gracias por las pistas que me habeis dado!!
Un saludo a todos.
Pues enhorabuena por haberlo conseguido, pero vamos, que me dejas perplejo...