Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL consultando várias tabelas


Ok, embora eu concorde em parte que você deve dar uma olhada e aprender mais sobre junções à esquerda, também há alguma dificuldade em responder a essa pergunta corretamente que pode ser perdida em um iniciante. Vou seguir em frente e ajudá-lo a responder, mas eu recomendaria aprender mais sobre junções.

Minha consulta exata dependeria dos índices disponíveis, mas muito provavelmente se assemelharia a algo assim:
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

O que estou fazendo é escrever uma subconsulta que une pedidos e produtos de pedidos, em que date_ordered está dentro de um determinado intervalo de datas (recomendo aprender sobre a função date_sub aqui:http://www.w3schools.com/sql/func_date_sub.asp e também fazer algumas consultas rápidas SELECT date_sub(date_ordered, INTERVAL X DAY) FROM orders para ter certeza de que você entendeu como esse cálculo funciona, na prática.

Agora, recebo minha lista de pedidos dos últimos X dias (7 na consulta acima) e a junto à tabela de produtos de pedidos para obter os produtos que foram pedidos. Aqui, eu quero desduplicar meus produtos, basicamente. Product_id =300 pode ter sido encomendado 70 vezes. Product_id =200 pode ter sido encomendado 50 vezes. Seja qual for o caso, eu não quero juntar 70 registros e 50 registros à minha tabela de produtos para IDs de produto 300 e 200, então eu os desduplo. Essa última instrução GROUP BY faz isso. Funcionalmente, é a mesma coisa que escrever DISTINCT (embora possa haver pequenas diferenças na forma como eles são calculados em determinadas circunstâncias, nenhuma dessas circunstâncias parece se aplicar aqui ... use DISTINCT se for mais claro para você)

Depois de ter minha lista de IDs de produtos exclusivos que foram pedidos nos últimos X dias, eu a uno à minha tabela de produtos. Aqui, eu uso uma junção à esquerda. Como os comentários mencionados acima, você deve examinar a noção de junções com bastante cuidado. Faça isso, se ainda não o fez.

Por último, aplico um filtro WHERE que diz "WHERE d.product_id IS NULL". O que isso está fazendo é dizer:"ok, se product_id =Y foi pedido nos últimos X dias, ele se juntará à minha tabela de produtos com sucesso com a.product_id =d.product_id. Se não foi pedido, então a. product_id existirá no meu conjunto de resultados, mas d.product_id não. Ou seja, d.product_id será nulo."

Essa última reviravolta pode ser a parte que não é aparente / destacada.

Espero que isto ajude.