MySQL - Duda con consulta mysql

   
Vista:

Duda con consulta mysql

Publicado por kx3 (2 intervenciones) el 27/09/2017 10:52:44
Buenos días, necesito ayuda con una consula que me esta volviendo loco, es en mysql.

Tengo una tabla en la que se guardan cajas de frutas, las cajas pueden ser de tres tipos y hay dos ubicaciones para estas cajas, las ubicaciones son IZQ y DER y los tipos son T1, T2 y T3, la cosa es que la tabla es así (esto no lo puedo cambiar, me viene dado):

1
2
3
4
5
6
7
8
9
10
11
CajaFruta	Ubicacion           	Provincia
 
Naranjas	Almacen IZQ tipo T1		Madrid
Naranjas	Almacen IZQ tipo T2		Madrid
Naranjas	Almacen IZQ tipo T1		Madrid
Manzanas	Almacen DER tipo T2		Madrid
Manzanas	Almacen IZQ tipo T2		Madrid
Peras		Almacen IZQ tipo T2		Madrid
Peras		Almacen IZQ tipo T2		Madrid
Platanos 	Almacen DER tipo T3		Madrid
Platanos	Almacen IZQ tipo T1		Madrid



El campo de ubicacion se rellena con cadena de texto como esa, con esos datos. Necesito sacar, por un lado, las cajas de las frutas que estan en distinto almacen y por otro lado las que son de distinto tipo.

He creado una consulta que me saca y agrupa:

1
SELECT CajaFruta, substring(Ubicacion,17,2)  as Almacen FROM Frutas where Provincia = 'Madrid' group by CajaFruta,Almacen order by CajaFruta, Almacen

Esto me saca, en este caso:

1
2
3
4
5
6
Manzanas	T2
Naranjas	T1
Naranjas	T2
Peras		T2
Platanos	T1
Platanos	T3

Necesito sacar las frutas que tienen cajas de varios tipos, en este caso, que no me salgan Manzanas ni Peras (ya que tienen el mismo tipo las cajas) pero si Platanos y Naranjas, ya que tienen cajas de tipo 1 y 3

Necesitaria lo mismo para el almacen, que me saque las frutas que tienen cajas en IZQ y DER

No se si con esa consulta que he hecho voy bien.

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

Duda con consulta mysql

Publicado por leonardo_josue (363 intervenciones) el 27/09/2017 16:34:23
Hola kx3:

En realidad tienes varias formas de obtener lo que quieres, la más simple es utilizar funciones de agrupación como COUNT para obtener la información que necesitas. Supongamos entonces que tienes tu información así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla;
+-----------+---------------------+-----------+
| CajaFruta | Ubicacion           | Provincia |
+-----------+---------------------+-----------+
| Naranjas  | Almacen IZQ tipo T1 | Madrid    |
| Naranjas  | Almacen IZQ tipo T2 | Madrid    |
| Naranjas  | Almacen IZQ tipo T1 | Madrid    |
| Manzanas  | Almacen DER tipo T2 | Madrid    |
| Manzanas  | Almacen IZQ tipo T2 | Madrid    |
| Peras     | Almacen IZQ tipo T2 | Madrid    |
| Peras     | Almacen IZQ tipo T2 | Madrid    |
| Platanos  | Almacen DER tipo T3 | Madrid    |
| Platanos  | Almacen IZQ tipo T1 | Madrid    |
+-----------+---------------------+-----------+
9 rows in set (0.00 sec)

Ahora bien, partamos de la subconsulta que pones, (aunque creo que tenías un error con la función substring):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT CajaFruta, SUBSTRING(Ubicacion,18,2) AS Almacen
    -> FROM tabla
    -> WHERE Provincia = 'Madrid'
    -> GROUP BY CajaFruta,Almacen
    -> ORDER BY CajaFruta,Almacen;
+-----------+---------+
| CajaFruta | Almacen |
+-----------+---------+
| Manzanas  | T2      |
| Naranjas  | T1      |
| Naranjas  | T2      |
| Peras     | T2      |
| Platanos  | T1      |
| Platanos  | T3      |
+-----------+---------+
6 rows in set (0.00 sec)

Con esta información lo que tienes que hacer es CONTAR LOS DISTINTOS TIPOS PARA CADA CAJA DE FRUTA, en otras palabras, hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT CajaFruta, COUNT(DISTINCT SUBSTRING(Ubicacion,18,2)) total_tipos
    -> FROM tabla
    -> WHERE Provincia = 'Madrid'
    -> GROUP BY CajaFruta
    -> ORDER BY CajaFruta;
+-----------+-------------+
| CajaFruta | total_tipos |
+-----------+-------------+
| Manzanas  |           1 |
| Naranjas  |           2 |
| Peras     |           1 |
| Platanos  |           2 |
+-----------+-------------+
4 rows in set (0.00 sec)

Observa que en el caso de las NARANJAS, aunque hay tres registros dos son del mismo tipo, el truco está en el COUNT-DISTINCT, ya que si no pones esto, la función COUNT simplemente te contaría el número re registros, independientemente del tipo que sea la caja:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT CajaFruta, COUNT(SUBSTRING(Ubicacion,18,2)) total_tipos
    -> FROM tabla
    -> WHERE Provincia = 'Madrid'
    -> GROUP BY CajaFruta
    -> ORDER BY CajaFruta;
+-----------+-------------+
| CajaFruta | total_tipos |
+-----------+-------------+
| Manzanas  |           2 |
| Naranjas  |           3 |
| Peras     |           2 |
| Platanos  |           2 |
+-----------+-------------+
4 rows in set (0.00 sec)

Finalmente, para filtrar sólo aquellas cajas que tengan más de un TIPO DISTINTO, utilizas la cláusula HAVING-COUNT:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT CajaFruta, COUNT(DISTINCT SUBSTRING(Ubicacion,18,2)) total_tipos
    -> FROM tabla
    -> WHERE Provincia = 'Madrid'
    -> GROUP BY CajaFruta
    -> HAVING COUNT(DISTINCT SUBSTRING(Ubicacion,18,2)) > 1
    -> ORDER BY CajaFruta;
+-----------+-------------+
| CajaFruta | total_tipos |
+-----------+-------------+
| Naranjas  |           2 |
| Platanos  |           2 |
+-----------+-------------+
2 rows in set (0.00 sec)

Algo muy similar podrías hacer para lo de IZQ y DER, modificando sólo el substring.

Te recomiendo que si no tienes mucha experiencia con el uso de funciones de agrupación, te tomes un tiempo para preguntarle a SAN GOOGLE por algunos ejemplos. él generalmente es de mucha ayuda.

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

Duda con consulta mysql

Publicado por kx3 (2 intervenciones) el 29/09/2017 10:10:48
Muchisimas gracias por la respuesta, eso era lo que necesitaba y me faltaba, el count distinct en el having

Mil 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
Revisar política de publicidad