sql >> Base de Datos >  >> RDS >> Mysql

MySQL consultando varias tablas

De acuerdo, si bien estoy de acuerdo en parte en que debería investigar un poco y aprender más sobre las uniones izquierdas, también hay algunos trucos para responder esta pregunta correctamente que un principiante podría perder. Continuaré y te ayudaré a responderla, pero recomendaría aprender más sobre las uniones.

Mi consulta exacta dependería de los índices disponibles, pero es muy probable que se asemeje a algo como esto:

SELECT a.* 
FROM products AS a
LEFT JOIN (
SELECT product_id FROM order_products as b 
INNER JOIN orders AS c
ON b.order_id = c.order_id
WHERE c.date_ordered >= date_sub(c.date_ordered, INTERVAL 7 day)
GROUP BY product_id 
) AS d
ON a.product_id = d.product_id 
WHERE d.product_id IS NULL

Lo que estoy haciendo es escribir una subconsulta que une pedidos y pedidos de productos, donde date_ordered se encuentra dentro de un cierto rango de fechas (recomendaría aprender sobre la función date_sub aquí:http://www.w3schools.com/sql/func_date_sub.asp y también realice algunas consultas rápidas de pedidos SELECT date_sub(date_ordered, INTERVAL X DAY) FROM para asegurarse de que comprende cómo funciona este cálculo en la práctica.

Ahora, obtengo mi lista de pedidos de los últimos X días (7 en la consulta anterior) y la combino con la tabla de productos de pedidos para obtener los productos que se ordenaron. Aquí, quiero deduplicar mis productos, básicamente. Product_id =300 puede haber sido pedido 70 veces. Product_id =200 puede haber sido pedido 50 veces. Cualquiera que sea el caso, no quiero unir 70 registros y 50 registros a mi tabla de productos para los ID de producto 300 y 200, así que los desduplé. Esa última instrucción GROUP BY hace eso. Es funcionalmente lo mismo que escribir DISTINCT (aunque puede haber diferencias menores en cómo se calculan en ciertas circunstancias, ninguna de esas circunstancias parece aplicarse aquí... use DISTINCT si le resulta más claro)

Una vez que tengo mi lista de ID de productos únicos que se ordenaron en los últimos X días, la combino con mi tabla de productos. Aquí, uso una combinación izquierda. Al igual que los comentarios mencionados anteriormente, querrá analizar la noción de uniones con mucho cuidado. Haz eso, si aún no lo has hecho.

Por último, aplico un filtro WHERE que dice "WHERE d.product_id IS NULL". Lo que está haciendo es decir, "bien, si se ordenó product_id =Y en los últimos X días, entonces se unirá a mi tabla de productos con éxito con a.product_id =d.product_id. Si no se ordenó, entonces a. product_id existirá en mi conjunto de resultados, pero d.product_id no. Es decir, d.product_id será nulo".

Ese último giro puede ser la parte que no es aparente/destaca.

Espero que esto ayude.