Using multiple group by in a query

Asked

Viewed 345 times

2

I have 3 tables: Products, Orders and Order Item.

Table: Produtos

id_produto    foto_produto    categoria    sub_categoria
---------------------------------------------------------
0081          15487.jpg       4            32
0491          18987.jpg       3            67
0141          11087.jpg       8            82

Table Pedidos
--------------------------
id_pedidos    data_pedido    
36987         15/11/2015
77897         12/11/2015
59870         11/11/2015

Table: Iten Pedido

id_item_produto   id_pedido
---------------------------
0081              33687
0491              33687
0141              77897
0081              59870

I need to create a query that returns all sub_category of a specific category, but with the photo of the product best sold in it in a period of 15 days. I am using the following query:

SELECT cod_pedido, inten.id_produto, count(id_produto) AS total, prod.cod_subcategoria1 FROM tb_pedidos_otimin as pedidos
left join tb_itens_pedidos_otimin as inten ON inten.id_pedido = pedidos.cod_pedido
left join tb_produtos_otimin as prod on inten.id_produto = prod.cod_produto
WHERE prod.cod_categoria1 = 38 AND data_pagamento BETWEEN '2015-11-15 00:00:00' and '2015-12-01 00:00:00' GROUP BY id_produto

But I can’t get it sorted by two Group By.

1 answer

2


I advise you to normalize your database. A product belongs to 1 or n categories. A category belongs to 1 or n subcategories. Building your database with this structure, it would be much simpler to query.

Adding the tables:

Table: Produtos

id_produto    foto_produto    id_categoria    
-------------------------------------------
0081          15487.jpg       4            
0491          18987.jpg       3            
0141          11087.jpg       8           

Table Pedidos
--------------------------
id_pedidos    data_pedido    
36987         15/11/2015
77897         12/11/2015
59870         11/11/2015

Table: Iten Pedido

id_item_produto   id_pedido
---------------------------
0081              33687
0491              33687
0141              77897
0081              59870

categoria
-----------
id_categoria    descricao
4               vestuario
3               eletronicos

subCategoria
------------
id_subCategoria      id_categoria   descricao
32                   1              camiseta
67                   1              bermuda
23                   2              notebooks

Having this structure in the bank, select would be as follows:

SELECT COUNT(Iten_Pedido.id_item_produto), produto.foto_produto,
categoria.descricao, subCategoria.descricao, pedido.data_pedido
FROM pedido
INNER JOIN iten_Pedido
ON iten_pedido.id_pedido = pedido.id_pedido
INNER JOIN produtos
ON iten_pedido.id_item_produto = produtos.id_produto
INNER JOIN categorias 
ON produtos.id_categoria = categorias.id_categoria
INNER JOIN subcategorias
ON categoris.id_categoria = subcategorias.id_categoria
WHERE  pedido.data_pedido BETWEEN '2015-11-15     00:00:00' and '2015-12-    01 00:00:00' 
GROUP BY item_pedido.id_produto, produto.foto_produto,
categoria.descricao, subCategoria.descricao, pedido.data_pedido 
ORDER BY DESC LIMIT 1

The order by DESC command sorts the record from largest to least, and the limit 1 command displays only the first record (the item with most orders). I advise to make this query separate. A query to list subcategories, and another for the product best sold. However, the idea to do this in a single consultation is there. I’m at work so I had no way to test the code, I hope I helped! NOTE: Often the group by clause needs to have ALL fields of your select.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.