Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

littlejuh

Agrupar resultados e buscar mais recente

Recommended Posts

HEY, alguém muito manjador que puder me ajudar.

Tenho a seguinte estrutura:

CREATE TABLE IF NOT EXISTS `cv2_status` (
  `cod_status` int(11) NOT NULL AUTO_INCREMENT,
  `descricao` varchar(55) NOT NULL,
  PRIMARY KEY (`cod_status`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `cv2_veiculos_marcas` (
  `cod_marca` int(10) NOT NULL AUTO_INCREMENT,
  `descricao` varchar(150) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `tipo` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `logomarca` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
  `chave_tipo_veiculo` int(10) NOT NULL,
  `cv2_veiculos_tipos_cod_tipo_veiculo` int(10) NOT NULL,
  PRIMARY KEY (`cod_marca`),
  KEY `fk_cv2_veiculos_marcas_cv2_veiculos_tipos1_idx` (`cv2_veiculos_tipos_cod_tipo_veiculo`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=176 ;



CREATE TABLE IF NOT EXISTS `cv2_veiculos_movimentacoes` (
  `cod_movimentacao` int(10) NOT NULL,
  `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `tipo` int(11) NOT NULL,
  `chave_veiculo` int(11) NOT NULL,
  PRIMARY KEY (`cod_movimentacao`),
  KEY `fk_cv2_veiculos_movimentacoes_cv2_status_idx` (`tipo`),
  KEY `fk_cv2_veiculos_movimentacoes_cv2_veiculos_idx` (`chave_veiculo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



CREATE TABLE IF NOT EXISTS `cv2_veiculos_tipos` (
  `cod_tipo_veiculo` int(10) NOT NULL AUTO_INCREMENT,
  `descricao` varchar(150) NOT NULL DEFAULT '',
  `descricao_plural` varchar(50) NOT NULL DEFAULT '',
  `codigo` varchar(150) NOT NULL DEFAULT '',
  `codigo_plural` varchar(50) NOT NULL DEFAULT '',
  `tabela` varchar(50) NOT NULL,
  `ativo` bit(1) NOT NULL,
  PRIMARY KEY (`cod_tipo_veiculo`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;



CREATE TABLE IF NOT EXISTS `cv2_veiculos_veiculos` (
  `cod_veiculo` int(10) NOT NULL AUTO_INCREMENT,
  `descricao` varchar(150) DEFAULT NULL,
  `visualizacoes` int(11) DEFAULT NULL,
  `foto_1` varchar(50) DEFAULT NULL,
  `foto_2` varchar(50) DEFAULT NULL,
  `foto_3` varchar(50) DEFAULT NULL,
  `foto_4` varchar(50) DEFAULT NULL,
  `foto_5` varchar(50) DEFAULT NULL,
  `foto_6` varchar(50) DEFAULT NULL,
  `valor` decimal(20,2) DEFAULT NULL,
  `valor_promocional` decimal(20,2) DEFAULT NULL,
  `itens` text,
  `observacoes` text,
  `data_cadastro` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ano` int(11) DEFAULT NULL,
  `unico_dono` bit(1) DEFAULT NULL,
  `novo` bit(1) DEFAULT NULL,
  `chave_vendedor` int(11) NOT NULL,
  `chave_marca` int(10) NOT NULL,
  `chave_tipo_veiculo` int(10) NOT NULL,
  `chave_localizacao` int(10) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`cod_veiculo`),
  KEY `fk_cv2_veiculos_veiculos_cv2_vendedores1_idx` (`chave_vendedor`),
  KEY `fk_cv2_veiculos_veiculos_cv2_veiculos_marcas1_idx` (`chave_marca`),
  KEY `fk_cv2_veiculos_veiculos_cv2_veiculos_tipos1_idx` (`chave_tipo_veiculo`),
  KEY `fk_cv2_veiculos_veiculos_cv2_localizacoes1_idx` (`chave_localizacao`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;

Estou fazendo uma query que seja mais ou menos isso:

SELECT `cv2_veiculos_veiculos`.cod_veiculo,
`cv2_veiculos_veiculos`.descricao, 
`cv2_veiculos_veiculos`.valor, 
`cv2_veiculos_veiculos`.valor_promocional,
`cv2_veiculos_veiculos`.data_cadastro,
`cv2_veiculos_veiculos`.status,
`cv2_veiculos_movimentacoes`.cod_movimentacao,
`cv2_veiculos_movimentacoes`.data AS `data_movimentacao`,
`cv2_veiculos_tipos`.`descricao` AS `tipo`,  
`cv2_veiculos_marcas`.`descricao` AS `marca`
FROM `cv2_veiculos_veiculos` 
INNER JOIN `cv2_veiculos_tipos` 
ON `cv2_veiculos_veiculos`.`chave_tipo_veiculo` = `cv2_veiculos_tipos`.`cod_tipo_veiculo`
INNER JOIN `cv2_veiculos_marcas` 
ON `cv2_veiculos_veiculos`.`chave_marca` = `cv2_veiculos_marcas`.`cod_marca` 
INNER JOIN `cv2_veiculos_movimentacoes`
ON `cv2_veiculos_movimentacoes`.`chave_veiculo` = `cv2_veiculos_veiculos`.`cod_veiculo` 
WHERE cv2_veiculos_tipos.`descricao` like '%carro%' AND cv2_veiculos_veiculos.`status` = 0 ;

Porém quero agrupar todos os resultados que contenham o mesmo cod_veiculo e ordenar a data_movimentacao para pegar somente a mais recente.

 

Alguem pode me ajudar ? =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

não testei sua query mas já testou algo simples como

group by cod_veiculo

e

order by data_movimentacao

não vi isso na query por isso me surgiu a curiosidade se teria testado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

para pegar somente a mais recente.

 

por isto o Max

 

neste exemplo ...

 

SELECT a.Id, IdCategoriaIdeia, IdUsuario, Titulo, Descricao, IdeiaUsada, a.DataInclusao 
FROM Ideia a 
where a.DataInclusao = (SELECT MAX(b.DataInclusao)
                        FROM Ideia b                       
                        WHERE b.Id = a.ID 
                        AND b.IdUsuario = a.IdUsuario)

pega a "ideia" mais recente ...

 

a questão é adaptar a sua query,.




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT `cv2_veiculos_veiculos`.id AS `id_veiculo`,       `cv2_veiculos_veiculos`.descricao,       `cv2_veiculos_veiculos`.valor,       `cv2_veiculos_veiculos`.valor_promocional,       `cv2_veiculos_veiculos`.data_cadastro,       `cv2_veiculos_veiculos`.status,       `cv2_veiculos_movimentacoes`.id AS `id_movimentacao`,       `cv2_veiculos_movimentacoes`.data AS `data_movimentacao`,       `cv2_veiculos_tipos`.`descricao` AS `tipo`,          `cv2_veiculos_marcas`.`descricao` AS `marca`FROM `cv2_veiculos_veiculos`       INNER JOIN `cv2_veiculos_tipos` ON `cv2_veiculos_veiculos`.`id_tipo` = `cv2_veiculos_tipos`.`id`   INNER JOIN `cv2_veiculos_marcas` ON `cv2_veiculos_veiculos`.`id_marca` = `cv2_veiculos_marcas`.`id`   INNER JOIN `cv2_veiculos_movimentacoes` ON `cv2_veiculos_movimentacoes`.`id` = `cv2_veiculos_veiculos`.`id`WHERE cv2_veiculos_tipos.`descricao` like '%carro%'AND cv2_veiculos_veiculos.`status` = 0AND cv2_veiculos_movimentacoes.data = (SELECT MAX(cv2_veiculos_movimentacoes.data)                                                                FROM cv2_veiculos_movimentacoes  cv2_veiculos_movimentacoes2                                                                                     WHERE cv2_veiculos_veiculos2.id = cv2_veiculos_movimentacoes.id)---------------------------------------------------------------------------------------------Um "as" talvez , ou o tamanho do aliasAND cv2_veiculos_movimentacoes.data =   (SELECT MAX(cv2_veiculos_movimentacoes2.data)    FROM cv2_veiculos_movimentacoes  as cv2_veiculos_movimentacoes2         WHERE cv2_veiculos_veiculos2.id = cv2_veiculos_movimentacoes.id)

---------

AND cv2_veiculos_movimentacoes.data =   (SELECT MAX(cv2m2.data)    FROM cv2_veiculos_movimentacoes  as cv2m2         WHERE cv2m2.id = cv2_veiculos_movimentacoes.id)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim, ele até agrupa os do mesmo id, porém, não retorna o mais recente:

SELECT `cv2_veiculos_veiculos`.id AS `id_veiculo`,
       `cv2_veiculos_veiculos`.descricao,
       `cv2_veiculos_veiculos`.valor,
       `cv2_veiculos_veiculos`.valor_promocional,
       `cv2_veiculos_veiculos`.data_cadastro,
       `cv2_veiculos_veiculos`.status,
       `cv2_veiculos_movimentacoes`.id AS `id_movimentacao`,
       `cv2_veiculos_movimentacoes`.data AS `data_movimentacao`,
       `cv2_veiculos_tipos`.`descricao` AS `tipo`,   
       `cv2_veiculos_marcas`.`descricao` AS `marca`
FROM `cv2_veiculos_veiculos`    
   INNER JOIN `cv2_veiculos_tipos` ON `cv2_veiculos_veiculos`.`id_tipo` = `cv2_veiculos_tipos`.`id`
   INNER JOIN `cv2_veiculos_marcas` ON `cv2_veiculos_veiculos`.`id_marca` = `cv2_veiculos_marcas`.`id`
   INNER JOIN `cv2_veiculos_movimentacoes` ON `cv2_veiculos_movimentacoes`.`id` = `cv2_veiculos_veiculos`.`id`
WHERE cv2_veiculos_tipos.`descricao` like '%carro%'
AND cv2_veiculos_veiculos.`status` = 0 

AND cv2_veiculos_movimentacoes.data = 
  (SELECT MAX(cv2m2.data) 
   FROM cv2_veiculos_movimentacoes  as cv2m2      
   WHERE cv2m2.id = cv2_veiculos_movimentacoes.id)

Resultado:

 

id descricao valor valor_promocional data_cadastro status id_movimentacao data_movimentacao tipo marca

1 Fusca 4000.00 4500.00 2013-02-06 16:17:13 0 1 2013-02-06 16:27:44 Carro Honda
3 Palio 8293892639.00 2013-02-07 10:53:00 0 3 2013-02-07 10:21:19 Carro Honda

 

E olha os registros da tabela movimentacoes, o veiculo de id = 1, tem movimentações mais recentes do que aquela que apareceu no resultado acima.

 

id data id_tipo id_veiculo

1 2013-02-06 16:27:44 1 1
2 2013-02-06 17:24:08 1 2
3 2013-02-07 10:21:19 2 1
4 2013-02-07 10:21:19 2 1
5 2013-02-07 10:21:44 2 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

então deve ser pelo id_veiculo

 

 

...
AND cv2_veiculos_movimentacoes.data = (SELECT MAX(cv2m2.data) 
                                       FROM cv2_veiculos_movimentacoes as cv2m2 
                                       WHERE cv2m2.id_veiculo =                         cv2_veiculos_movimentacoes.id_veiculo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como cv2_veiculos_movimentacoes se relaciona com cv2_veiculos_veiculos ?!

 

ao ínves de :

INNER JOIN `cv2_veiculos_movimentacoes` ON `cv2_veiculos_movimentacoes`.`id` = `cv2_veiculos_veiculos`.`id`

não seria

INNER JOIN `cv2_veiculos_movimentacoes` ON `cv2_veiculos_movimentacoes`.`id_veiculo` = `cv2_veiculos_veiculos`.`id` 

 

?


 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como cv2_veiculos_movimentacoes se relaciona com cv2_veiculos_veiculos ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

CREATE TABLE IF NOT EXISTS `cv2_veiculos_movimentacoes` ( `id` int(11) NOT NULL, `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `tipo` int(11) NOT NULL, `id_veiculo` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `fk_cv2_veiculos_movimentacoes_cv2_status_idx` (`tipo`), KEY `fk_cv2_veiculos_movimentacoes_cv2_veiculos_idx` (`id_veiculo`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

o id_veiculo na tabela veiculos_movimentacoes é relacionado ao id da tabela veiculos_veiculos, relação de 1:n

 

Já consegui! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

então ...

 

SELECT `cv2_veiculos_veiculos`.id AS `id_veiculo`, 
`cv2_veiculos_veiculos`.descricao, 
`cv2_veiculos_veiculos`.valor, 
`cv2_veiculos_veiculos`.valor_promocional, 
`cv2_veiculos_veiculos`.data_cadastro, 
`cv2_veiculos_veiculos`.status, 
`cv2_veiculos_movimentacoes`.id AS `id_movimentacao`, 
`cv2_veiculos_movimentacoes`.data AS `data_movimentacao`, 
`cv2_veiculos_tipos`.`descricao` AS `tipo`, `cv2_veiculos_marcas`.`descricao` AS `marca` 
FROM `cv2_veiculos_veiculos` 
INNER JOIN `cv2_veiculos_tipos` ON `cv2_veiculos_veiculos`.`id_tipo` = `cv2_veiculos_tipos`.`id` INNER JOIN `cv2_veiculos_marcas` ON `cv2_veiculos_veiculos`.`id_marca` = `cv2_veiculos_marcas`.`id` INNER JOIN `cv2_veiculos_movimentacoes` ON `cv2_veiculos_movimentacoes`.`id_veiculo` = `cv2_veiculos_veiculos`.`id` 
WHERE cv2_veiculos_tipos.`descricao` like '%carro%' 
AND cv2_veiculos_veiculos.`status` = 0 
AND cv2_veiculos_movimentacoes.data = (SELECT MAX(cv2m2.data) 
                                      FROM cv2_veiculos_movimentacoes as cv2m2 
                                      WHERE cv2m2.id_veiculo = cv2_veiculos_movimentacoes.id_veiculo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Siim, alterei algumas coisas a mais mas assim funcionou também, eu tava pondo errado um negócio :( ! Obrigada Motta =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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