El día de hoy veremos cómo extraer datos de 2 tablas SQL distintas, combinarlos y extraer solo los primeros de ellos a partir de un parámetro de ordenamiento.
El ejemplo que mostraré va a mostrar los productos más vendidos en una tienda, pero esos productos se venden al contado o en apartado, y cada uno está en una tabla distinta.
Lo que se requiere es obtener los productos más vendidos sin importar a cuál tabla pertenecen, ordenándolos, combinándolos y extrayendo solo los primeros N.
Explicación del algoritmo
No sé si existe una consulta SQL para combinar y ordenar datos de distintas tablas. No se me ocurre, así que mejor he usado el lenguaje de programación. El algoritmo queda así:
- Obtener los datos de la tabla 1, ordenados de mayor a menor
- Obtener los datos de la tabla 2, ordenados de mayor a menor
- Combinar los datos de la tabla 1 con la 2. Recorremos los datos de la tabla 2, si el dato ya existe en los datos de la tabla 1, aumentamos su cantidad (cantidad vendida en este caso) y si no lo agregamos a los datos de la tabla 1.
- Ordenamos los datos por la cantidad vendida
- Limitamos los datos a la cantidad deseada. Por ejemplo, solo obtenemos los primeros 10 y descartamos los demás.
Veamos cómo hacerlo con un ejemplo práctico con Golang.
Nota: el “motor” de base de datos que uso es SQLite3.
Ejemplo con Go
Primero veamos cómo obtener los datos por separados según cada tabla:
Fíjate que una tabla es productos_vendidos
y otra tabla es productos_apartados
. La consulta es prácticamente la misma, solo que de distintas tablas. Ambas son ordenadas por la cantidad vendida.
Los obtenemos a continuación y los combinamos, luego los ordenamos con quicksort y finalmente los cortamos en caso de que superen la cantidad deseada:
Por cierto, la función existeProducto
debería llamarse indiceProducto
y devuelve el índice de un producto en un arreglo o -1
si no existe:
Y finalmente aquí tenemos la función quicksort que ordena ese arreglo de tipo Struct:
Por cierto, estoy usando apuntadores en Go aunque más tarde descubrí que no son necesarios y que podemos modificar un arreglo a partir de su índice cuando se pasa a una función… pero ya no quise probar y modificar, además, si funciona no lo toques.
Si alguien conoce alguna manera de hacerlo con puro SQL agradecería si coloca su solución en los comentarios.