Using multiple group by in a query

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 the sub_category of a specific category, but with the best-selling product photo in it in a period of 15 days. I'm 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'm not able to sort by two Group By.

    
asked by anonymous 08.12.2015 / 14:37

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 would make it much simpler at the time of your 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 database, the select would look like this:

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 records from highest to least, and the limit 1 command displays only the first record (the most ordered item). I would advise doing this separate query. One query to list the subcategories, and another to the best-selling product. But the idea to do this in one query is there. I'm at work so I had no way to test the code, I hope I've helped! NOTE: Often the group by clause needs to have ALL fields of your select.

    
08.12.2015 / 15:45