MySQL - Consulta entre dos tablas

 
Vista:
sin imagen de perfil

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 25/05/2017 12:51:53
Buenas tardes.

Quería saber si es posible hacer un tipo de consulta que no encuentro por ninguna parte.

Teniendo dos tablas, Tabla1 y Tabla2

Tabla 1

nombre id
------ ---
Primero 1
Primero 2
Primero 3
Primero 6
Segundo 1
Segundo 2
Segundo 4
Tercero 1
Tercero 7
Cuarto 3
Quinto 8



Tabla2

id
---
1
2
3


Como puedo hacer la consulta para que me devuelva solo el nombre de la tabla 1 que tenga TODOS los valores de la tabla2? En este caso solo devería devolverme el nombre Primero.

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

Consulta entre dos tablas

Publicado por leonardo_josue (414 intervenciones) el 25/05/2017 16:42:03
Hola Diego:

Creo que esta pregunta es parecida a una que hiciste en el foro de SQL... te comento que hay varias formas de hacer esto que necesitas, y básicamente es lo mismo que te comentaba en la otra, se trata de saber CONTAR:

Primero, como mencioné en otro post, lo que tienes que hacer es un JOIN entre tus tablas para descartar TODOS AQUELLOS VALORES DE ID QUE NO TE INTERESAN:

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
40
41
42
43
mysql> SELECT * FROM tabla1;
+---------+------+
| nombre  | id   |
+---------+------+
| Primero |    1 |
| Primero |    2 |
| Primero |    3 |
| Primero |    6 |
| Segundo |    1 |
| Segundo |    2 |
| Segundo |    4 |
| Tercero |    1 |
| Tercero |    7 |
| Cuarto  |    3 |
| Quinto  |    8 |
+---------+------+
11 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)
 
mysql> SELECT tabla1.*
    -> FROM tabla1
    -> INNER JOIN tabla2 ON tabla1.id = tabla2.id;
+---------+------+
| nombre  | id   |
+---------+------+
| Primero |    1 |
| Primero |    2 |
| Primero |    3 |
| Segundo |    1 |
| Segundo |    2 |
| Tercero |    1 |
| Cuarto  |    3 |
+---------+------+
7 rows in set (0.00 sec)

Observa que ahora sólo eaparecen aquellos ID's que realmente necesitas... Qué pasa entonces si haces un conteo de id's para cada proveedor??? pues que aquel que tenga el mismo numero de id's que la cantidad de id's en tu tabla2 es el que tiene todos...

MUCHO OJO, estoy considerando que cada ID se repite UNA Y SÓLO UNA, es decir, que no tengas cosas así:

1
2
3
4
5
| Primero |    1 |
| Primero |    1 |
| Primero |    2 |
| Primero |    2 |
| Primero |    2 |

Si fuera el caso entonces debes hacer un DISTINCT en el conteo.

haz la prueba y nos comentas.

saludos
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

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 26/05/2017 11:26:34
Hola.

Gracias por los consejos.

Finalmente ha funcionado e incluso con lo del conteo puedo hacer hasta el porcentaje de correlación entre tablas.

Finalmente ha sido
1
2
3
4
mysql> SELECT tabla1.*, count(tabla1.id) suma
    -> FROM tabla1
    -> INNER JOIN tabla2 ON tabla1.id = tabla2.id
    ->GROUP BY nombre ORDER BY DESC;

Con esto consigo hacer más o menos lo que quiero, aunque se me ha complicado el proyecto y ahora tengo un tercer campo en la tabla 1 con cantidad, algo así.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT * FROM tabla1;
+---------+------++------+
| nombre  | id   | cantidad
+---------+------++------+
| Primero |    1 |   1
| Primero |    2 |   1
| Primero |    3 |   2
| Primero |    6 |   1
| Segundo |    1 |  3
| Segundo |    2 |  1
| Segundo |    4 |   2
| Tercero |    1 |  1
| Tercero |    7 |  1
| Cuarto  |    3 |   2
| Quinto  |    8 |    3
+---------+------+
11 rows in set (0.00 sec)

pero en la tabla2 no existe campo cantidad, sino que puede haber dos veces el mismo id, con lo que son dos unidades.

con lo cual además de coincidir en id, también tendría que coincidir en cantidad.

Voy a ver si se puede hacer y como.

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

Consulta entre dos tablas

Publicado por leonardo_josue (414 intervenciones) el 26/05/2017 16:26:55
Hola de nuevo Diego:

No estoy seguro de haber entendido la última parte de tu problema, pero veamos si es más o menos así. Según nos comentas, ahora tu tabla1 tiene la siguiente información:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT * FROM tabla1;
+---------+------+----------+
| nombre  | id   | cantidad |
+---------+------+----------+
| Primero |    1 |        1 |
| Primero |    2 |        1 |
| Primero |    3 |        2 |
| Primero |    6 |        1 |
| Segundo |    1 |        3 |
| Segundo |    2 |        1 |
| Segundo |    4 |        2 |
| Tercero |    1 |        1 |
| Tercero |    7 |        1 |
| Cuarto  |    3 |        2 |
| Quinto  |    8 |        3 |
+---------+------+----------+
11 rows in set (0.06 sec)

y si entendí correctamente, ahora la tabla2 puede tener algo así:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    3 |
+------+
4 rows in set (0.00 sec)

¿correcto? entonces, lo primero que tienes que hacer sería obtener la cantidad de veces que se repite cada ID en tu tabla2, esto lo haces con un COUNT simple:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT id, COUNT(id) cantidad
    -> FROM tabla2
    -> GROUP BY id;
+------+----------+
| id   | cantidad |
+------+----------+
|    1 |        1 |
|    2 |        1 |
|    3 |        2 |
+------+----------+
3 rows in set (0.00 sec)

ahora, el INNER JOIN lo puedes hacer sobre esta subconsulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT *
    -> FROM tabla1
    -> INNER JOIN
    -> ( SELECT id, COUNT(id) cantidad
    ->   FROM tabla2
    ->   GROUP BY id ) t2
    -> ON tabla1.id = t2.id AND tabla1.cantidad = t2.cantidad;
+---------+------+----------+------+----------+
| nombre  | id   | cantidad | id   | cantidad |
+---------+------+----------+------+----------+
| Primero |    1 |        1 |    1 |        1 |
| Primero |    2 |        1 |    2 |        1 |
| Primero |    3 |        2 |    3 |        2 |
| Segundo |    2 |        1 |    2 |        1 |
| Tercero |    1 |        1 |    1 |        1 |
| Cuarto  |    3 |        2 |    3 |        2 |
+---------+------+----------+------+----------+
6 rows in set (0.00 sec)


Dale un vistazo para ver si es más o menos lo que necesitas.

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

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 27/05/2017 12:50:06
Pues tiene toda la pinta de que es lo que necesito.

A ver si me pongo después y te comento, pero en principio creo que si me soluciona.

Eres una máquina.

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

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 28/05/2017 23:43:13
Hola de nuevo.

Le he estado dando vueltas este fin de semana y funciona perfectamente, pero me falla un pequeño detalle. Te pongo la consulta final que he hecho (son otros nombres) y te digo lo que me da fallo.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * , COUNT( Tabla1.id) total
FROM Tabla1
INNER JOIN (
 
SELECT Tabla2.id, COUNT( Tabla2.id) cantidad
FROM Tabla2
GROUP BY Tabla2.id
)Tabla2 ON Tabla1.id= Tabla2.id
AND Tabla2.cantidad <= Tabla1.CANT
AND Tabla1.total = COUNT(Tabla2.id)
GROUP BY Tabla1.DOCU, Tabla1.TIED
ORDER BY total DESC

Quiero que solo me salgan los que tengan TODOS los registros de la tabla2, por eso pongo la línea AND Tabla1.total = COUNT(Tabla2.id) que es la que me falla, tanto en Tabla1.total como en COUNT(Tabla2.id)

No se de que otra manera se podría hacer.

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

Consulta entre dos tablas

Publicado por leonardo_josue (414 intervenciones) el 29/05/2017 15:33:27
Hola Diego:

Una de los problemas por los que no debes postear la misma pregunta en dos foros es porque después te olvidadas de leer las respuestas de los otros posts... claramente te puse en el foro de SQL qué es lo que debías de hacer:

1
2
como ayuda extra INVESTIGA LA CLÁUSULA HAVING y cómo se usa con el operador COUNT...
eso es lo único que falta...

En otras palabras EN LUGAR DE PONER TU CONDICIÓN EN EL WHERE DEBES DE PONERLA EN LA SECCIÓN HAVING -_-'}

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

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 29/05/2017 17:02:49
Hola.

Gracias por la respuesta.

Esta noche lo miro y te digo.

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

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 30/05/2017 12:29:21
Hola de nuevo.

Efectivamente funciona a la perfección.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * , COUNT( Tabla1.id) total
FROM Tabla1
INNER JOIN (
 
SELECT Tabla2.id, COUNT( Tabla2.id) cantidad
FROM Tabla2
GROUP BY Tabla2.id
)Tabla2 ON Tabla1.id= Tabla2.id
AND Tabla2.cantidad <= Tabla1.cantidad
GROUP BY Tabla1.Nombre
HAVING total = (SELECT COUNT ( Tabla2.id ) FROM Tabla2)
ORDER BY total DESC


Ahora me surge otro problema en el que no había caido, y este si que no se si se podrá hacer en la misma consulta o como se podría hacer.

En la tabla1 tengo otra columna, color

1
2
3
4
5
6
7
8
9
10
11
12
+---------+------+----------+------+----------+-----------+
| nombre  | id   | cantidad | id   | cantidad | color
+---------+------+----------+------+----------+-------------+
| Primero |    1 |        1 |    1 |        1 |    rojo
| Primero |    1 |        1 |    1 |        1 |   azul
| Primero |    2 |        1 |    2 |        1 |   rojo
| Primero |    3 |        2 |    3 |        2 |    rojo
| Segundo |    2 |        1 |    2 |        1 |   azul
| Segundo |    2 |        1 |    2 |        1 |    rojo
| Tercero |    1 |        1 |    1 |        1 |   rojo
| Cuarto  |    3 |        2 |    3 |        2 |   rojo
+---------+------+----------+------+----------+

En realidad, quiero exactamente lo mismo que antes, ya que no me interesa el color, solo quiero que coincida con la tabla2 el id, pero si que quiero tener la suma de cantidades de todos los id sea cual sea el color.
Es decir, para el nombre Primero, id 1 hay un rojo y un azul, por lo tanto tiene 2 unidades de id 1, que es lo que quiero comparar con las unidades de id 1 de la tabla 2.

No se si es posible hacerlo en la misma consulta.

He probado lo siguiente, pero creo que no hace lo que quiero.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * , COUNT( Tabla1.id) total, SUM(Tabla1.cantidad)
FROM Tabla1
INNER JOIN (
 
SELECT Tabla2.id, COUNT( Tabla2.id) cantidad
FROM Tabla2
GROUP BY Tabla2.id
)Tabla2 ON Tabla1.id= Tabla2.id
AND Tabla2.cantidad <= Tabla1.cantidad
GROUP BY Tabla1.Nombre, Tabla1.id
HAVING total = (SELECT COUNT ( Tabla2.id ) FROM Tabla2)
ORDER BY total DESC


A ver si puedes decirme al menos si es factible esa consulta.

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

Consulta entre dos tablas

Publicado por leonardo_josue (414 intervenciones) el 30/05/2017 17:26:18
Diego, lo que preguntas ahora no tiene nada que ver con la pregunta inicial O_o es decir, cada vez que contestas agregas algo nuevo y por tanto estamos hablando de cosas muy distintas... esto a "ensuciado" demasiado esta pregunta y tampoco es correcto en el foro.

Si tienes cosas adicionales ENTONCES NO DEBES SEGUR PREGUNTANTO LO MISMO EN EL POST, da por cerrado el post original y abre uno nuevo con la nueva información y pon la referencia a los post's anteriores si lo consideras necesario para tener contexto del problema...

Antes de postear, date unos minutos para reflexionar si ya no hay más cosas que te falte considerar, a final de cuentas llevas 5 días dándole vueltas al mismo asunto lo cual es mucha pérdida de tiempo.

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

Consulta entre dos tablas

Publicado por Diego (13 intervenciones) el 30/05/2017 19:04:36
Ok

En principio solo quería saber si es posible hacerlo, pero tienes razón que ya no hay quien se aclare

Voy a darle unas vueltas y si no me sale ya abro un hilo nuevo.

Gracias.

(la petición inicial está solucionada)
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