Ir para conteúdo
vbndesign

Retornar último registro de cada grupo verificando o status do grupo

Recommended Posts

Boa noite pessoal. Estou com um problema que não faço ideia de como solucionar.

Tenho uma tabela que trás o histórico de palestras com os seguintes campos.

- id
- id_usuario

- id_status_palestra
- data_palestra

- data_cadastro

 

Sempre que um usuário é cadastrado em uma palestra ele fica com o status de palestra pré-agendada. Porém a data desta palestra pode ser alterada e com isso cria-se um novo registro com a nova data fazendo o histórico.

 

A questão é que eu preciso pegar o último registro de cada usuário e caso ele esteja com o status de palestra pré-agendada (neste exemplo) contar quantos usuários se encontram nesta condição e agrupa-los pela data da palestra. Desta forma eu saberia quais datas eu tenho usuários com a palestra pré-agendada e quantos são.

 

Tentei ler vários posts parecidos mas sem sucesso devido a minha limitação com algumas funções e agrupamento de resultados com SQL.

 

Se alguém puder me ajudar agradeço muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala ai Motta. Até entendi o sql que postou no post que citou mas o meu caso é um pouco diferente e envolve mais coisas.

 

No caso eu alterei os nomes dos atributos para ficar menor no post acima mas a tabela é essa aqui em baixo com alguns registros.

 

tabela1.jpg

 

Dai como pode perceber eu posso ter mais de um registro para cada usuário. Como expliquei acima esta tabela grava qualquer alteração das datas da palestra e status das mesmas sempre em novos registros fazendo com que eu tenha um histórico de ações.

 

O que eu preciso é sempre pegar o último registro de cada usuário de acordo com o seu status e agrupá-los pela data da palestra para saber a quantidade total.

 

Exemplo:

No meu sistema eu preciso retornar quantos usuários estão com o status da palestra igual a 1 e mostrar a quantidade total através da data.

 

Neste caso a minha consulta deveria retornar os codigo_usuarioxpalestra: 2, 5 e 6. Em seguida agrupá-los pela data o que resultaria em 2 usuários na data 2014-03-10 e 1 usuário na data 2014-03-17.

 

Eu até consegui fazer alguma coisa na consulta abaixo, porém eu não consegui fazer com que o codigo_usuarioxpalestra 3 ficasse de fora já que o último registro deste usuário está com o cod_status_palestra igual a 2 e também não consegui agrupá-los pela data fazendo uma contagem do total.

 

 

SELECT uxa1.codigo_usuarioxpalestra, uxa1.cod_usuario, uxa1.cod_status_palestra, (SELECT data_palestra FROM t_usuarioxpalestra AS uxa2 WHERE uxa2.cod_usuario = uxa1.cod_usuario ORDER BY uxa2.codigo_usuarioxpalestra DESC LIMIT 1) AS data
FROM t_usuarioxpalestra AS uxa1
GROUP BY uxa1.cod_usuario ORDER BY uxa1.cod_usuario

 

Abs.

Editado por vbndesign

Compartilhar este post


Link para o post
Compartilhar em outros sites

marcosmarcolin tentei aqui e não foi, vou passar como está construido aqui.


$SQL_noticias = mysql_query("SELECT * FROM noticias INNER JOIN categoria ON(noticias.categoria = categoria.id_categoria) WHERE url_categoria = '$arquivo' AND ORDER BY id_noticia DESC");
  while($lh2 = mysql_fetch_array($SQL_noticias)){
  $idNoticia = $lh2['id_noticia'];
  $tituloNoticia = $lh2['titulo'];
  $legendaNoticia = $lh2['legenda'];
  $imagemNoticia = $lh2['imagem'];
  $urlNoticia = $lh2['url'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei em uma forma de fazer, não é a melhor prática.

 

$max_id = mysqli_query($con, "SELECT MAX(ID) FROM noticias"); // Recebe o maior ID da tabela, ex: 98
$max_id = $max_id -1; // tira o último ID ficando 97

// depois executa a consulta
$res = mysqli_query($con, "SELECT * FROM noticias LIMIT '$max_id' ORDER BY ASC"); // inicia do 0 e vai até 97

Só ajustar pro teu JOIN.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 29/10/2018 at 09:48, andrepinheiroti disse:

Alguém saberia me dizer como faço para retornar todos os registros menos o último? Agradeço desde já a todos!

 

SELECT 
a.id
FROM
bd.tabela AS a
WHERE
a.id NOT IN (SELECT MAX(id) AS id FROM bd.tabela)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.