SQL - Ayuda: obtener el mismo campo en dos registros de una tabla

   
Vista:

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por José Manuel (7 intervenciones) el 05/11/2013 10:38:20
Hola.

Soy bastante nuevo en esto del sql, y tengo un problema que seguro que es simple, pero que no consigo resolver, por más manuales de sql que he consultado. Estoy trabajando en mysql 5.5.

Supongamos que tengo una lista de alumnos, que forman grupos de dos alumnos para hacer un trabajo. Para ello, creo estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Tabla alumnos:
+-----------+---------------+
| id_alumno | nombre_alumno |
+-----------+---------------+
| 1         | Antonio       |
| 2         | Luis          |
| 3         | Manuel        |
| 4         | Juan          |
| 5         | Francisco     |
| 6         | Alejandro     |
+-----------+---------------+
 
Tabla grupos:
+-------+---------+---------+
| grupo | alumno1 | alumno2 |
+-------+---------+---------+
| 1     | 1       | 3       |
| 2     | 5       | 2       |
| 3     | 4       | 6       |
+-------+---------+---------+

La tabla "grupos" me dice qué dos alumnos de la tabla "alumnos" forman cada grupo. El resultado que busco es el siguiente:

1
2
3
4
5
6
7
8
Resultado buscado:
+-------+---------------+----------------+
| GRUPO | PRIMER ALUMNO | SEGUNDO ALUMNO |
+-------+---------------+----------------+
| 1     | Antonio       | Manuel         |
| 2     | Francisco     | Luis           |
| 3     | Juan          | Alejandro      |
+-------+---------------+----------------+

Es decir, un listado con el número de cada grupo, y los dos alumnos que lo componen.

El problema con el que me choco es cómo definir la cláusula SELECT. En principio, entiendo que debería ser algo así:

1
2
3
4
5
6
7
SELECT
    grupos.grupo AS 'GRUPO',
    alumnos.nombre_alumno AS 'PRIMER ALUMNO',
    alumnos.nombre_alumno AS 'SEGUNDO ALUMNO'
FROM
    alumnos,
    grupos

Pero esto no tiene mucho sentido, porque si las dos últimas líneas del SELECT hacen referencia a la misma columna de la misma tabla, me van a obtener siempre el mismo resultado.
Está claro que me falta algo, pero no encuentro la manera. Como he dicho, estoy muy verde en sql, así que si alguien me puede orientar se lo agradecería mucho.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por xve (237 intervenciones) el 05/11/2013 11:31:40
Hola José Manuel, la manera que yo lo haría, seria juntando dos consultas por el GRUPO... algo así:

1
2
3
4
5
6
7
8
9
10
11
select * from
(
    SELECT grupo, nombre_alumno AS Alumno1
    GROM grupos JOIN alumnos ON grupos.alumno1=alumnos.id_alumno
) s1
LEFT JOIN
(
    SELECT grupo, nombre_alumno AS Alumno2
    GROM grupos JOIN alumnos ON grupos.alumno2=alumnos.id_alumno
) s2
ON s1.grupo=s2.grupo

Coméntanos si te sirve, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por José Manuel (7 intervenciones) el 05/11/2013 11:37:44
Muchas gracias, lo pruebo y te digo.

Una cosa, entiendo que donde pone GROM debería poner FROM ¿no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por xve (237 intervenciones) el 05/11/2013 16:32:42
uy... mil perdones, si, si, es FROM.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por José Manuel (7 intervenciones) el 05/11/2013 12:40:20
Sí que funciona, muchas gracias.

La única pega es que me lista dos veces la columna "grupo", es decir, algo así:

1
2
3
4
5
6
7
+-------+-----------+-------+-----------+
| grupo | Alumno1   | grupo | Alumno2   |
+-------+-----------+-------+-----------+
| 1     | Antonio   | 1     | Manuel    |
| 2     | Francisco | 2     | Luis      |
| 3     | Juan      | 3     | Alejandro |
+-------+-----------+-------+-----------+

Pero bueno, supongo que trasteando un poco averiguaré como arreglarlo.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por xve (237 intervenciones) el 05/11/2013 16:34:05
Eso no es problema... aqui lo tienes nuevamente:
1
2
3
4
5
6
7
8
9
10
11
select s1.grupo,s1.Alumno1,s2.Alumno2 from
(
    SELECT grupo, nombre_alumno AS Alumno1
    FROM grupos JOIN alumnos ON grupos.alumno1=alumnos.id_alumno
) s1
LEFT JOIN
(
    SELECT grupo, nombre_alumno AS Alumno2
    FROM grupos JOIN alumnos ON grupos.alumno2=alumnos.id_alumno
) s2
ON s1.grupo=s2.grupo

Ya nos comentaras...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por leonardo_josue (877 intervenciones) el 05/11/2013 17:32:29
Hola José Manuel y xve:

En realidad no hay necesidad de complicar tanto la consulta, si bien la consulta que propone xve funciona realmente resulta excesivo e innecesario hacer tantas subconsultas... Lo que tienes es una doble referencia hacia una misma tabla, por lo tanto lo que tienes que hacer es un DOBLE JOIN sobre de la tabla alumnos... el único detalle es que necesitas utilizar un ALIAS para cada tabla... observa el ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mysql> SELECT * FROM alumnos;
+-----------+---------------+
| id_alumno | nombre_alumno |
+-----------+---------------+
|         1 | Antonio       |
|         2 | Luis          |
|         3 | Manuel        |
|         4 | Juan          |
|         5 | Francisco     |
|         6 | Alejandro     |
+-----------+---------------+
6 rows in set (0.00 sec)
 
mysql> SELECT * FROM grupos;
+-------+---------+---------+
| grupo | alumno1 | alumno2 |
+-------+---------+---------+
|     1 |       1 |       3 |
|     2 |       5 |       2 |
|     3 |       4 |       6 |
+-------+---------+---------+
3 rows in set (0.00 sec)
 
mysql> SELECT G.grupo, A1.nombre_alumno, A2.nombre_alumno
    -> FROM grupos G
    -> INNER JOIN alumnos A1 ON A1.id_alumno = G.alumno1
    -> INNER JOIN alumnos A2 ON A2.id_alumno = G.alumno2
    -> ORDER BY G.grupo;
+-------+---------------+---------------+
| grupo | nombre_alumno | nombre_alumno |
+-------+---------------+---------------+
|     1 | Antonio       | Manuel        |
|     2 | Francisco     | Luis          |
|     3 | Juan          | Alejandro     |
+-------+---------------+---------------+
3 rows in set (0.00 sec)

Observa que el truco está en los INNER JOINS... aunque se hacen sobre la misma tabla de alumnos, estoy usando un ALIAS distinto (A1 y A2) de manera que puedo unir cada columna de la tabla GRUPOS con esta tabla... la consulta como ven resulta más simple y se llega al mismo resultado.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por xve (237 intervenciones) el 05/11/2013 19:05:25
FENÓMENO!!!!

Muy agradecido!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por José Manuel (7 intervenciones) el 05/11/2013 19:30:56
Muchas gracias a los dos, xve y leonardo, no sólo por las consultas sql, sino por la explicación.

La verdad es que esto era sólo un ejemplo. Lo necesito para un tema más complejo, que implica 6 o 7 tablas, concretamente para obtener unos datos de una tienda en Prestashop, y esta última forma me parece más comprensible, y más fácil de ampliar para adaptarlo al caso real.

Hay una cosa que me desconcierta un poco. Entiendo que la signación de los alias se hace en el FROM, al poner "... grupos G ...", y en los INNER JOIN, al poner "... alumnos A1 ..." y "... alumnos A2 ...", pero el SELECT, que está antes, ya utiliza G, A1 y A2. ¿Da igual? ¿el gestor de bases de datos lo interpreta correctamente?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por leonardo_josue (877 intervenciones) el 06/11/2013 15:50:51
Hola de Nuevo José Manuel:

Efectivamente, tal como lo dices, los alias se declaran hasta el FROM, pero puedes utilizarlos desde el SELECT

En realidad el "orden" en que se validan las consultas es primero el FROM, después el SELECT, es por eso que aunque los ALIAS se declaran el la sección del FROM o en los respectivos INNER JOIN, los alias puedes utilizarlos desde el SELECT.

En general, el uso de alias es opcional, es decir, podrías optar por no colocar ningún alias y trabajar directamente con los nombres de las tablas, sin embargo, como te comenté en el post pasado, este es un caso especial donde tienes una doble referencia a una misma tabla, por lo tanto el uso de los alias es ABSOLUTAMENTE NECESARIO.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda: obtener el mismo campo en dos registros de una tabla

Publicado por Alias2 (1 intervención) el 04/08/2015 18:06:17
Se te agredece mucho por la ayuda.
Tenia un problema igual pero gracias a tu aporte me has ayudado.

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar