# Obtener el MAX y el MIN en un objeto json dentro de una columna json

### Información previa

A veces tenemos que obtener información contenida en columnas tipo json, existentes en nuestra base de datos.

Aquí vamos a ver cómo podemos hacerlo.

> En el momento de escribir este artículo no encontré forma de hacerlo en Laravel 9. Si te animas hay un post en [Laracast - Is there a way to get the max of a JSON array in MYSQL](https://laracasts.com/discuss/channels/eloquent/is-there-a-way-to-get-the-max-of-a-json-array-in-mysql) (no hace falta ser usuario de pago) 

### Escenario

Tabla con una columna tipo json llamada `data`. Su contenido tipo es el de abajo, y buscamos el MIN y el MAX del valor `response_time`

En este escenario el valor está normalizado `number`

```json
{
	"data": {
		"csq": -62,
		"icc": "8944501801213377498",
		"imei": "869640059692007",
		"device": "modem",
		"sunset": 1652071940,
		"sunrise": 1652124780,
		"datetime": 1652082623,
		"response_time": 11.29
	},
	"message": "successful",
	"success": true
}
```

### Sql

```sql
mysql> SELECT MAX(JSON_EXTRACT(data, "$.data.response_time")) as response  FROM table;
+----------+
| response |
+----------+
| 55.88    |
+----------+
1 row in set (0,03 sec)

mysql> SELECT MIN(JSON_EXTRACT(data, "$.data.response_time")) as response  FROM table;
+----------+
| response |
+----------+
| 6.15     |
+----------+
1 row in set (0,04 sec)
```

### Bonus 

Es posible, sobre todo si trabajamos en un proyecto no depurado todavia en el que guardamos datos a los bruto, sin normalización o verificación, que nos salgan valores anormales. 

Entonces es bueno obtener los datos de un número limitado de la respuesta ordenados para ver si es algo que falla.

```sql
SELECT id, JSON_EXTRACT(data, "$.data.response_time") as response  FROM tabla ORDER BY JSON_EXTRACT(data, "$.data.response_time") DESC LIMIT 20;
+--------+----------+
| id     | response |
+--------+----------+
| 224623 | 600.47   |
| 200807 | 598.7    |
| 177004 | 598.54   |
| 177006 | 598.29   |
| 177005 | 598.29   |
| 177008 | 597.68   |
| 153187 | 596.45   |
| 153189 | 596.33   |
| 129369 | 595.87   |
| 129368 | 595.85   |
| 129371 | 595.33   |
|  10806 | 588.38   |
|  10807 | 588.35   |
|  10809 | 588.19   |
| 273886 | 25.08    |
|  24709 | 22.62    |
| 265865 | 22.32    |
|  92768 | 20.92    |
| 275543 | 20.91    |
| 122073 | 20.15    |
+--------+----------+
20 rows in set (1,30 sec)
```

Evidentemente aquí hay una desviación bastante clara que debemos limpiar o revisar.



##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como esta, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/cart.php?gid=18).