Consultas SQL multiples tablas

APOCa

Me gustaría saber como trabajáis exactamente cuando queréis obtener información de la bbdd de múltiples tablas.

Por ejemplo vamos a suponer que debemos obtener el listado de todos los clientes con las compras efectuadas y los productos.

¿Realizáis una query para obtener los clientes, por cada cliente una query para las compras y por cada compra otra query de los productos?

B

http://www.w3schools.com/sql/sql_join.asp

1 1 respuesta
APOCa

#2 Y digo yo. De esa forma, si no me equivoco, la consulta devolvería n filas por cada cliente, no?

Una por cada cliente, mas una por cada compra del mismo cliente, mas una por cada producto de la compra.

Es mas eficiente realizarlo de esa manera y luego por programación hacerte tu objeto bonico o como.

1 respuesta
eXtreM3

#3 no exactamente, te devuelve todo de golpe.

Tabla Clientes: idCliente, nombre
Tabla Compras: idCompra, idCliente

select t1.nombre, t2.*
from Clientes as t1 left join Compras as t2 ON t1.idCliente = t2.idCliente

Eso te va a devolver algo tal que:

nombre, idCompra, idCliente
nombre, idCompra, idCliente
...
nombre, idCompra, idCliente

Es más eficiente por consulta, evidentemente. Luego puedes (y debes) optimizarlas añadiendo índices, cláusulas where... etc.

themaz

Usa :

Left join
O
Inner join

Pero ten cuidado ya que puede hacer que las consultas sean lentas, depende del tamaño y complejidad

APOCa

El caso que yo expongo la idea es obtener TODA la info el cliente para devolver un json bien formadito. Como si estuvieras trabajando con mongodb por ejemplo.

Y es por ello que no se si resulta mas practico hacer todas las querys secundarias y añadirlo al objecto o bien currarse la query y por código formar el objeto.

No es como normalmente que no cruzas muchos datos y vas haciendo consultas por cuando lo necesitas.

De normal por ejemplo haces una consulta con el listado de clientes, con la info justa, y puede que calculando el total de compras. Al clickar al cliente, consultarías toda la info del cliente, etc.

1 respuesta
JuAn4k4

¿ Necesitas toda esa info de golpe ? - Esta es básicamente la misma pregunta que la tuya.

RaymaN

Meter querys en bucles está prohibidísimo si te importa el rendimiento.

En una query lo puedes sacar todo, solo tienes que ir formando el objeto según lees el resultado.

SELECT cln.*, cmp.*, prd.*
FROM clientes cln
LEFT JOIN compras cmp ON cmp.id_cliente = cln.id
LEFT JOIN productos prd ON prd.id = cmp.id_producto
1
eXtreM3

#6 tienes que ver cuál es el flujo de tu aplicacion.

Si tienes que mostrar toda la info inicialmente, tendrás que traerlo de la bd antes de cargar la vista. Para que al hacer click en un cliente o en una compra, veas instantáneamente sus datos.

O bien puedes cargar sólo las compras, que será mucho más rápido que no tener que cargarle los clientes en la query, y después si haces click en un cliente hacer una llamada asíncrona al servidor con el id del cliente seleccionado.

1 respuesta
Merkury

#9 Mira este es un buen ejemplo donde meter Redis, si la informacion es tan extensa como dice. Redis con los objetos cacheados.

B

1- Usa "JOINS" cuando necesites datos de varias tablas SIEMPRE.
2- Comprueba que las relaciones entre tablas estén indexadas. Muy importante o tendrás problemas de rendimiento con tables grandes.
3- Si son consultas generales y se repiten con frecuencia ( búsqueda de productos, etc) añade un nivel adicional de cache(memcache,redis,etc) para reducir carga.
4- Lee el "Object-oriented Design Heuristics" .

APOCa

Sí, es necesario obtener toda la info de golpe y no como un flujo.

Mirare el tema de redis y el libro que comentas.

Usuarios habituales