Consulta SQL. Ultimas Compras

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

1 curtida

Olá @rpassos81,

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;
2 curtidas

blz, mas a questão do select dentro do outro é porque eu preciso de uma lista com todos os clientes e suas 5 ultimas compras.

ex:
cliente1 10/12/15 nf 10
cliente1 17/12/15 nf 50
cliente1 20/12/15 nf 70
cliente2 16/12/15 nf 34
cliente5 10/12/15 nf 7
cliente5 12/12/15 nf 13
cliente5 15/12/14 nf 20

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)

Espero que tenha ajudado.

Veja outro exemplo também em http://psoug.org/definition/rank.htm

[]s

1 curtida

Vou tentar passar para o Mysql. Obrigado!

Cara, funções analíticas são um máximo