Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Select com ultimas linhas inseridas (mais difícil do


MarceloTune

Pergunta

Bom dia/tarde/noite

Indo direto ao ponto.

Preciso pegar os dados de duas tabelas (relacionadas normalmente entre uma chave estrangeira), sendo que na segunda tabela deve vir apenas o ultimo registro inserido de cada chave estrangeira.

Por exemplo, para a chave estrangeira de nome "idVisitante" e de valor "5", deve vir apenas a ultima tupla(linha) inserida.

Mesmo que hajam 10 linhas com o valor "5" na coluna "idVisitante", o select deve trazer apenas a ultima linha inserida destas 10.

O mesmo deve ocorrer para os outros valores de "idVisitante".

Espero que resolvamos este Select 03_piscando.png

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Denis,

Tentei fazer a query com a função MAX, mas não obtive sucesso.

Tentei montar uma query utilizando outras duas subquerys, uma com o MAX, e outra com um filtro "like" sobre um campo da primeira tabela. (este filtro like eu ainda não havia mencionado, mas ele não é problema)

Posso colar estas minhas tentativas aqui, mas elas estão bizarras, porque não consegui fazê-las corretamente.

Pelo que vi até agora, parece que é possível fazer isso com Procedures, mas como minha experiência com Procedures é zero, imaginei que seria melhor fazer com querys simples mesmo.

Link para o comentário
Compartilhar em outros sites

  • 0

Por favor poste as estruturas das tabelas em forma de instrução create table com os devidos indices para que eu possa pensar em uma solução.

Os nomes das tabelas e os nomes dos campos podem ser fictícios. O que interessa são os campos principais e a forma como você montou o relacionamento entre as tabelas.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

Segue a estrutura das tabelas.

Retirei os campos supérfluos.

A estrutura é de um banco Mysql.

Outra coisa que não falei.

Não sei se meu pensamento procede, mas estava tentando fugir de procedures porque precisarei fazer este bendito SELET para MySQL e também para SQLite. Ai se eu usasse alguma função incomum, correria o risco de não existir em algum destes dois bancos.

Desde já agradeço.

--
-- Table structure for table `visita`
--
CREATE TABLE IF NOT EXISTS `visita` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`idVisitante` int(11) DEFAULT NULL,
`data_entrada` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`data_saida` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idVisitante` (`idVisitante`),
)

--
-- Table structure for table `visitante`
--
CREATE TABLE IF NOT EXISTS `visitante` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`cod_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
)
Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

A query básicona que fiz é esta abaixo:

SELECT va.data_entrada, ve.nome
FROM `visitante` AS ve LEFT JOIN `visita` AS va ON ve.id = va.idVisitante;
O objetivo seria puxar todos visitantes, sendo que quando houver relação com a tabela visita (sempre haverá, pois é um relacionamento obrigatório) deve trazer a data_entrada da ultima visita feita por aquele visitante.
Acho que consegui explicar direito o meu problema.
Estou tentando resolver isso em uma query porque terei que migrar esta solução para dois bancos distintos (MySQL e SQL). Mas caso a solução venha em uma procedure já ficaria muito grato!
Link para o comentário
Compartilhar em outros sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

Denis,

Segue a estrutura das tabelas.

Retirei os campos supérfluos.

A estrutura é de um banco Mysql.

Outra coisa que não falei.

Não sei se meu pensamento procede, mas estava tentando fugir de procedures porque precisarei fazer este bendito SELET para MySQL e também para SQLite. Ai se eu usasse alguma função incomum, correria o risco de não existir em algum destes dois bancos.

Desde já agradeço.

--
-- Table structure for table `visita`
--
CREATE TABLE IF NOT EXISTS `visita` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`idVisitante` int(11) DEFAULT NULL,
`data_entrada` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`data_saida` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idVisitante` (`idVisitante`),
)

--
-- Table structure for table `visitante`
--
CREATE TABLE IF NOT EXISTS `visitante` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`cod_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
)

Com base no código acima faça assim:

Este primeiro select é para pegar a última visita de cada visitante.(Você não precisará dele, mas servirá de entendimento para o que virá a seguir)

SELECT idVisitante, max(data_entrada) AS ultimaVisitaDesteCara
FROM visita
GROUP BY idVisitante

Agora o código definitivo

SELECT v1.nome, v2.ultimaVisitaDesteCara
FROM visitante v1
INNER JOIN (SELECT idVisitante, max(data_entrada) AS ultimaVisitaDesteCara
FROM visita
GROUP BY idVisitante) v2 ON v2.idVisitante = v1.id

O resultado será uma listagem com todos os visitantes e as datas de suas últimas visitas

Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

Sua solução serviu perfeitamente!

Eu já estava a alguns dias com esse problema.

Você conseguiu me ajudar, teve a preocupação de que eu entendesse a informação e sem esperar nada em troca.

Acho que isso pode ser a expressão mais sincera de bondade. Obrigado

;)

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...