SQL - Consulta SQL con INNER JOIN

 
Vista:
sin imagen de perfil

Consulta SQL con INNER JOIN

Publicado por cotarejo (12 intervenciones) el 07/07/2015 19:30:15
buenas tardes, tengo un pequeño problema... vamos a ver, tengo dos tablas, una llamada tablarestaurantes:


tablarestaurantes


Y la otra tabla llamada tablaprecios:



tablaprecios

El caso es que necesito hacer una consulta seleccionando todos los restaurantes que sean de una localidad y tengan hasta un precio, por ejemplo.

SELECT tablarestaurantes.nombre, tablaprecios.precio FROM tablarestaurantes INNER JOIN tablaprecios WHERE tablaprecios.precio<=11 AND tablarestaurantes.localidad="Santander" ORDER BY precio ASC

Pensaba que esa consulta estaba bien hecha, pero al hacerla poniendo el precio a máximo 11€ me devuelve dos restaurantes... uno que está correcto ya que es de Santander y tiene un precio de 11€ el menú, y el otro que no, ya que tiene un precio de 12€ el menú y no de 11.


resultado

¿¿Porqué puede ser??

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

Consulta SQL con INNER JOIN

Publicado por leonardo_josue (1173 intervenciones) el 07/07/2015 20:36:36
Hola cotarejo:

Tienes un horror (no error :P) de sintaxis con el uso del INNER JOIN, y es que estás omitiendo la cláusula ON, que es la que especifica la relación que hay entre las dos tablas. Tal como lo tienes se está realizando un producto cartesiano entre las tablas, checa este ejemplo, supongamos que tienes estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla1;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id_2 | descripcion |
+------+-------------+
|    1 | one         |
|    2 | two         |
|    3 | three       |
+------+-------------+
3 rows in set (0.00 sec)

Ahora, observa qué pasa cuando haces un INNER JOIN sin cláusula ON:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT *
    -> FROM tabla1
    -> INNER JOIN tabla2;
+------+-------------+------+-------------+
| id_1 | descripcion | id_2 | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    1 | one         |
|    3 | tres        |    1 | one         |
|    1 | uno         |    2 | two         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    2 | two         |
|    1 | uno         |    3 | three       |
|    2 | dos         |    3 | three       |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
9 rows in set (0.00 sec)

cada elemento de la tabla1 se relaciona con cada elemento de la tabla2 (esto es un producto cartesiano)

Si quisieramos obtener el nombre en español y su correspondiente nombre en inglés, debemos especificar que el ID es el que relaciona las dos tablas, esto lo hacemos con la cláusula ON:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT *
    -> FROM tabla1
    -> INNER JOIN tabla2
    -> ON tabla1.id_1 = tabla2.id_2;
+------+-------------+------+-------------+
| id_1 | descripcion | id_2 | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)

haz la prueba y nos comentas.

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
2
Comentar
sin imagen de perfil

Consulta SQL con INNER JOIN

Publicado por cotarejo (12 intervenciones) el 07/07/2015 23:07:12
Efectívamente me faltaba la propiedad ON entre los IDS de las tablas, al ponerlo funcionó correctamente:

ON tablarestaurantes.id = tablaprecios.id



Muchísimas gracias leonardo_josue!!



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: 17
Ha aumentado su posición en 4 puestos en SQL (en relación al último mes)
Gráfica de SQL

Consulta SQL con INNER JOIN

Publicado por Juan (16 intervenciones) el 08/07/2015 00:27:30
Buenas cotarejo

A parte de lo que te dice leonardo_josue. Recordarte que cuando se usa cadenas el no usar el comando LIKE puede no darte los resultados adecuados. De manera que la condición del tablarestaurantes.localidad="Santander", la podrías poner (yo te lo aconsejaría al menos) así tablarestaurantes.localidad LIKE "Santander"

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

Consulta SQL con INNER JOIN

Publicado por leonardo_josue (1173 intervenciones) el 08/07/2015 15:49:50
Hola de nuevo...

Con respecto a lo que comenta Juan cabe hacer una aclaración.

el operador LIKE sirve para encontrar patrones en cadenas... ¿qué quiere decir esto? sirve por ejemplo para encontrar las cadenas que empiecen con alguna letra, que CONTENGAN en su interior alguna subcadena, que finalicen con una terminación en específico, ETC... para este caso se utilizan los operadores comodin, como % o _. Sin embargo NO ES RECOMENDABLE UTILIZAR CONDICIONES LIKE ya que estas tienen un pésimo rendimiento, lo que puede hacer que una consulta sea muy lenta.

Ahora bien, lo que propone Juan es hacer esto:

1
tablarestaurantes.localidad LIKE "Santander"

Sin embargo, al no utilizar operadores comodín la consulta arrojaría el mismo resultado que haciendo una igualación, pero, LA IGUALACIÓN tiene mejor desempeño... en otras palabras, ES MEJOR HACER ESTO:

1
tablarestaurantes.localidad = "Santander"

Finalmente, hay que recordar que en SQL dependiendo la codificación que utilizaste al definir tus campos tipo texto, puede ser sensitivo a mayúsculas y minúsculas y a los acentos, por lo tanto

1
2
3
4
5
6
México
MEXICO
mexico
méxico
MeXico
MÉXICO

son cadenas COMPLETAMENTE DISTINTAS...

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
2
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 4 puestos en SQL (en relación al último mes)
Gráfica de SQL

Consulta SQL con INNER JOIN

Publicado por Juan (16 intervenciones) el 12/07/2015 00:49:13
Buenas Leonardo

Sabía lo del rendimiento, aunque a patrón igualitario tienes razón que es mejor como tú dices. Gracias por la clase, maestro. Mi voto positivo para ti ;)

Un saludo
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