Boa tarde!
Preciso criar uma consulta no banco que me traga as ultimas 5 compras de um cliente. Eu consegui trazer as compras, porem não consigo filtrar somente as ultimas 5. Tentei colocar um limit 5 no select interno mas não funcionou.
SELECT c.* FROM cliente AS c INNER JOIN (SELECT * FROM nfe_cabecalho) AS n ON c.id = n.id_cliente
você tem dentro da sua table compra a informação das datas da compra? Se tiver, você pode ordenar pela data em ordem decrescente (da maior para a menor) usando ORDER BY 'coluna' DESC e aí aplicar o limit para pegar só as 5 últimas.
algo +/- assim
SELECT c.* FROM cliente AS c
INNER JOIN (SELECT * FROM nfe_cabecalho) AS n ON c.id = n.id_cliente
ORDER BY c.data_da_compra DESC LIMIT 5;
Outra coisa é que você não precisa fazer o SELECT para usar INNER JOIN (e fica ate menos eficiente fazer isso).
Dá para fazer direto:
SELECT c.* FROM cliente AS c
INNER JOIN nfe_cabecalho AS n ON (c.id = n.id_cliente)
ORDER BY c.data_da_compra DESC LIMIT 5;
Claro que nesses exemplos ele não está fazendo o filtro para o cliente desejado. Logo essa query retornaria as 5 últimas comprar para qualquer cliente. você ainda precisaria usar um WHERE como alguma informação do cliente que você quer, como o id, por exemplo. Aí ficaria:
SELECT c.* FROM cliente AS c
INNER JOIN nfe_cabecalho AS n ON (c.id = n.id_cliente)
WHERE n.id_cliente = "número do id do cliente desejado"
ORDER BY c.data_da_compra DESC LIMIT 5;
e por ai vai, ou seja trazer uma lista com todos e seu compras, eu poderia listar todos os cliente e depois consultar as ultimas 5 compras, usando o limit, porem gostaria de saber se da para fazer no sql direto
Você não tem que usar um subselect pra buscar os clientes e as compras… pra isso você usa o join…
SELECT c.*, n.* FROM cliente AS c
JOIN nfe_cabecalho AS n ON c.id = n.id_cliente
WHERE n.id_cliente = "número do id do cliente desejado"
ORDER BY n.data_da_compra DESC LIMIT 5;
mas a questão não é buscar as compras de um cliente e sim de todos. Sendo assim, este sql não ira funcionar, pois ele vai trazer somente 5 registro que no meu exemplo acima seria as compras do cliente1, cliente2 e uma compra do cliente5, o que eu quero é trazer um lista com uns 1000 registros mas que seja as ultimas 5 compras de cada cliente.
Tenho algo parecido, utilizando banco de dados Oracle. O exemplo abaixo:
select * from (
select
cd_cgc_fornecedor,
nr_ordem_compra,
rank() over (partition by cd_cgc_fornecedor order by nr_ordem_compra desc) r
from ordem_compra o
where 1=1
)where r < 11
No caso do meu exemplo eu queria uma consulta com as ultimas 10 ordens de compra (campo nr_ordem_compra da tabela ordem_compra) por CNPJ (campo cd_cgc_fornecedor da tabela ordem_compra)