SQL - Duda consulta MySql

 
Vista:

Duda consulta MySql

Publicado por Mikel (4 intervenciones) el 13/03/2013 10:40:06
Buenos días:

Soy Mikel, estudiante de 3er curso de Ingeniería Técnica en Informática de Gestión. En estos momentos me encuentro en medio del desarrollo de mi proyecto de fin de carrera y a pesar de que pensaba que "medio" dominaba MySql, estoy teniendo una serie de problemas a la hora de realizar unas consultas que me están desesperando. A ver si me podéis echar un cable.

Me explico:

La parte de la BD que me interesa para esta consulta consta de 3 tablas. Las tablas de Alumnos, Habla e Idiomas.

Alumnos(dni, nombre, apellido);
Habla(dni, cod_idioma);
Idiomas(cod_idioma, nom_idioma);

Me duda surge a la hora de imprimir todos aquello alumnos que hablen por ejemplo: Ingés y Alemán. Con un solo idioma lo consigo mediante una serie de joins, pero cuando se trata de la intersección de dos o más idioma, me mata.

Intuitivamente, mi intuición me dirigió por este codigo:

select estudiantes.* from estudiantes, habla, idiomas where estudiantes.dni = habla.dni and idiomas.cod_idioma = habla.cod_idioma and nom_idioma = 'Inglés' and nom_idioma = 'Alemán';

Por supuesto, me devolvió conjunto vació.

A ver si me podéis ayudar a llegar a la solución.

Un saludo y gracias por todo de antemano,

Mikel
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
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda consulta MySql

Publicado por xve (284 intervenciones) el 13/03/2013 13:12:36
Hola Mikel, primeramente te aconsejo juntar la tablas con join, haces trabajar menos a MySQL haciendo que sea mas rapido. También te aconsejo no buscar por el nombre del idioma, sino que por el id del mismo, ya que es mas rapido y da a tener menor errores.

dicho esto, la consulta seria algo así:

1
2
3
4
SELECT * FROM
Alumnos a LEFT JOIN Habla h ON a.dni=h.dni
LEFT JOIN Idiomas i ON h.cod_idioma=i.cod_idioma
WHERE i.nom_idioma='Inglés' OR i.nom_idioma='Alemán'


Coméntanos, 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

Duda consulta MySql

Publicado por Mikel (4 intervenciones) el 13/03/2013 14:28:18
Buenas tardes,

Primero, muchas gracias por tu respuesta, pero el problema persiste. El caso es que en el código que me has puesto, se imprimen todos aquellos alumnos que hablan tanto ingles como alemán. Lo que me interesa y no consigo, es imprimir aquello alumnos que hablen ambos. Me explico? Uso el AND y me devuelvo un conjunto vació.

Alguna idea?

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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda consulta MySql

Publicado por leonardo_josue (1173 intervenciones) el 13/03/2013 22:16:20
Hola Mikel:

Esta es una de las consultas más comunes que se plantean en el salón de clases y de las que puedes encontrar más ejemplos en internet... me soprende que no hayas dado con ningún ejemplo que te pueda servir... Ojo con eso. Como maestro que soy no me parece correcto darte la respuesta, pero sí puedo darte algunos tips para que obtengas la respuesta por tu propia cuenta. Para hacer esta consulta vas a tener que hacer uso de la función COUNT y de las cláusulas GROUP y HAVING. Imagina que tienes los siguientes datos:

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
37
38
39
mysql> SELECT * FROM Alumnos;
+------+--------+----------+
| dni  | nombre | apellido |
+------+--------+----------+
|    1 | Uno    | One      |
|    2 | Dos    | Two      |
|    3 | Tres   | Three    |
|    4 | Cuatro | Four     |
|    5 | Cinco  | Five     |
+------+--------+----------+
5 rows in set (0.03 sec)
 
mysql> SELECT * FROM Idiomas;
+------------+------------+
| cod_idioma | nom_idioma |
+------------+------------+
|          1 | Ingles     |
|          2 | Frances    |
|          3 | Aleman     |
|          4 | Portugues  |
+------------+------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM Habla;
+------+------------+
| dni  | cod_idioma |
+------+------------+
|    1 |          1 |
|    1 |          3 |
|    2 |          1 |
|    2 |          2 |
|    3 |          2 |
|    3 |          3 |
|    4 |          1 |
|    4 |          2 |
|    4 |          3 |
|    5 |          4 |
+------+------------+
10 rows in set (0.00 sec)


En realidad la tabla qué más te debe importar es la de HABLA, ya que esta es la que contiene la información para la búsqueda.

De esta tabla, puedes obtener aquellos alumnos que hablan las lenguas que quieres, con un OR como lo indicó xve o mejor aun con la función IN:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT dni, cod_idioma FROM Habla
    -> WHERE cod_idioma IN (1, 3);
+------+------------+
| dni  | cod_idioma |
+------+------------+
|    1 |          1 |
|    1 |          3 |
|    2 |          1 |
|    3 |          3 |
|    4 |          1 |
|    4 |          3 |
+------+------------+
6 rows in set (0.00 sec)


Observa bien esta tabla, los DNI's (1 y 4) APARECE DOS VECES, lo que implica que el usuario habla las dos lenguas, el DNI (2) y el DNI (3) SOLO APARECEN UNA VEZ lo que implica que sólo hablan una de las lenguas. Lo que debes hacer es AGRUPAR por el DNI y encontrar aquellos registros que aparezcan 2 veces. El resultado de esta consulta te debe servir para filtrar sólo los alumnos que te interesa.

Inténtalo, si tienes problemas publica lo que intentaste hacer y con gusto te ayudamos a resolver lo que falta.

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

Duda consulta MySql

Publicado por Mikel (4 intervenciones) el 13/03/2013 23:45:52
Que grandes! Muchísimas gracias! Estas pistas me han aclarado la cabeza jejej.

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
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda consulta MySql

Publicado por xve (284 intervenciones) el 14/03/2013 07:55:21
Excelente Leonardo!!!
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

Duda consulta MySql

Publicado por Mikel (4 intervenciones) el 14/03/2013 13:10:28
Sois muy grandes gente! Gracias a vosotros lo he conseguido sacar.

1
2
3
4
SELECT dni FROM Habla
WHERE cod_idioma IN ( 1, 3 )
GROUP BY dni
HAVING COUNT( dni ) >1


GRACIAS DE CORAZÓN!
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