[RESOLVIDO] Select MAX(ID) não funciona corretamente

Alguém sabe me dizer porque este SELECT abaixo no MYSQL está pegando o maior ID corretamente, mas os campos (valor, data e status) não trazem as informações do maior ID retornado. O SELECT está pegando o maior ID, mas as informações dos campos (valor, data e status) retornados são de outro ID.

$this->db->query("SELECT max(id), valor, afiliado_id, data, status FROM afiliado_saque_logs WHERE afiliado_id = 27");

Já se eu utilizar o select abaixo não traz nada, sendo que existem as informações no banco e não sei porque não retorna nenhum resultado.

select * from afiliado_saque_logs where id = (select max(id) from afiliado_saque_logs) and afiliado_id = 27

The MAX() function returns the largest value of the selected column.

É justamente o que falo no post! Eu pego o maior ID, porem as informações retornadas dos campos (valor, data e status) não são do maior ID retornado pelo select, são de outro ID.

A função MAX() do SQL retorna um único valor. Isso significa que o simples fato de defini-la no select não irá trazer qualquer outro valor se não o maior id, trazendo todos os demais resultados como se a função não tivesse sido definida. Para que ela funcione como você quer, deve fazer algo como:

SELECT id, valor, afiliado_id, data, status 
FROM afiliado_saque_logs
WHERE id = (SELECT MAX(id) FROM afiliado_saque_logs);

Exemplificando (com um banco próprio):

2 curtidas

Qual é o seu banco?

Eu faria assim se fosse MySQL

SELECT * FROM tb_exemplo ORDER BY id DESC LIMIT 1

tenho desempenho melhor que a sub - select e faz a lógica ficar mais clara ordenando do id maior para o menor pegando somente a última posição.

2 curtidas

@Iohannes

Eu faço desta forma que você citou e funciona, porem quando coloco o (afiliado_id = 27) da pessoa que eu quero trazer o maior ID com os campos (valor, data, status) aí não retorna nada conforme o select abaixo, sendo que existem informações para o afiliado_id = 27.

SELECT id, valor, afiliado_id, data, status 
FROM afiliado_saque_logs
WHERE id = (SELECT MAX(id) FROM afiliado_saque_logs) and afiliado_id = 27

@jeanpjm mostre o conteúdo da tabela para gente ver aonde você está errando?

Sim @Dragoon é MySQL. No caso, quis mostrar para ele como a função MAX funciona e, nesse como deveria ser o seu uso naquele caso específico.
Obs.: sugiro que se faça como o @Dragoon informou:

SELECT * FROM afiliado_saque_logs ORDER BY id DESC LIMIT 1;

As vezes ‘traduzir’ o comando/consulta ajuda a entender melhor:

“Selecione tudo da tabela afiliado_saque_logs ordenando pelo id de forma decrescente limitando-se a um resultado”.

Agora aqui:

SELECT id, valor, afiliado_id, data, status 
FROM afiliado_saque_logs
WHERE id = (SELECT MAX(id) FROM afiliado_saque_logs) and afiliado_id = 27

Você quer que a consulta retorne o último registro e que seja com id 27? Confusão não? Se o id for 30, como ele vai trazer os dados do Id 30 e que seja igual a 27? Traduzindo o comando:

“Selecione id, valor, afiliado_id, data, status da tabela afiliado_id onde id é igual ao maior id da tabela e o id seja igual a 27”.
É isso mesmo? O que você realmente quer fazer?

Foi meio que mencionado acima, mas acredito que seu problema é que você quer mostrar os dados do maior id para o afiliado_id = 27. Ou seja, na sua primeira query de exemplo, você deveria mover esse WHERE para dentro da subquery:

select * 
from afiliado_saque_logs 
where id = (select max(id) from afiliado_saque_logs WHERE afiliado_id = 27) 

Aquela sua primeira query vai lançar um erro na maioria dos bancos de dados, o Mysql aceita (ou costuma aceitar) mas nao sei qual o resultado esperado para isso.

@AbelBueno

Correto Abel! eu quero mostrar no mysql os dados do maior ID do afiliado_id = 27

Eu tento com a query abaixo, mas não retorna nada, sendo que tem informações no banco.

select * from afiliado_saque_logs where id = (select max(id) from afiliado_saque_logs) and afiliado_id = 27

Estou na rua agora, porem assim que eu chegar em casa no final da tarde vou testar com a sua query abaixo:

select * from afiliado_saque_logs where id = (select max(id) from afiliado_saque_logs WHERE afiliado_id = 27)

Funcionou @AbelBueno

Sua query funcionou perfeitamente!

Muito obrigado pela sua ajuda!

@AbelBueno

Preciso de outra ajuda sua com o SELECT!

Como faço para verificar se na tabela (afiliado_saque_logs) o afiliado_id = 27 possui algum registro com campo (status) = 0

Ou como faço para contar os registros onde o campo (status) é = 0 para o afiliado_id = 27

Pois eu preciso confirmar se afiliado_id = 27 possui algum registro com campo (status) = 0

Como faço para verificar se na tabela (afiliado_saque_logs) o afiliado_id = 27 possui algum registro com campo (status) = 0

select * from tabela
where afiliado_id = 27
and status = 0

Ou como faço para contar os registros onde o campo (status) é = 0 para o afiliado_id = 27
Pois eu preciso confirmar se afiliado_id = 27 possui algum registro com campo (status) = 0

  select count(*) from tabela
  where afiliado_id = 27
  and status = 0

valeu @Robinho_Gomes_Junior

obrigado!

Marque como solução a resposta que te ajudou jovem, não sua própria resposta, caso tenha chegado a uma solução sozinho, aí neste caso coloque em sua resposta o que você fez para resolver e marque como solução!

Perdão! já marquei as respostas de @AbelBueno e @Robinho_Gomes_Junior pois salvaram meu dia.

Abraços