Ir para conteúdo

POWERED BY:

Arquivado

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

Mário Monteiro

[Resolvido] Finalizar consulta no MySQL

Recommended Posts

Bom dia povo

 

Tenho uma consulta que ainda não consegui deixar da melhor forma que queria

 

Tem mais dados mas com estes dados de exemplo ja da para mostrar o que preciso

 

Ignorem o fato das iamgens serem do access pois onde estou consultando é mysql mesmo

 

TABELA USUARIO

Imagem Postada

 

TABELA ACAO

Imagem Postada

 

Basicamente queria pegar a ultima ação de cada usuário ordenado pela data de ação e que tenha acontecido a mais de 30 dias ou seja se alguem fez ação nos últimos 30 dias não será recuperado na consulta

 

Ou seja teria como resultado basicamente isso

 

Imagem Postada

 

Lembro que na verdade a data está em Unix Format por isso abaixo usarei o FROM_UNIXTIME, então não estranhem isso

 

Mas não consegui, o máximo que consegui foi selecionar os usuários que não tem acoes no ultimo mês mas como não vem na ordem não sei quem ta mais tempo sem ações

 

A consulta que usei para recuperar o que falei anteriormente é essa, só que como verão vem sem a DATA

 

SELECT DISTINCT ID, NOME FROM USUARIO WHERE ID NOT IN (SELECT ID FROM USUARIO INNER JOIN ACAO ON USUARIO.ID = ACAO.ID_USUARIO WHERE FROM_UNIXTIME(DATA) > DATE_SUB(NOW(), INTERVAL 1 MONTH)))

 

Ou seja eu recupero quem eu preciso recuperar mas não sei em que ordem estão

 

Tentei de outras formas mas não consegui por isso deixei assim que pelo menos me ajuda mas queria deixar exatamente como preciso

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma gambiarra pra quebrar galho,

 

SELECT

	T3.nome AS nome,
	( SELECT data from acao WHERE id_usuario = T.id and data < DATE_SUB( NOW(), INTERVAL 1 MONTH ) limit 1 ) AS data

FROM
(
SELECT
			DISTINCT usuario.id AS id
			FROM
			usuario, acao
			WHERE 
			usuario.id = acao.id_usuario
			AND
			acao.data < DATE_SUB( NOW(), INTERVAL 1 MONTH )

GROUP BY acao.data DESC
) AS T,
usuario AS T3

WHERE 
	T.id = T3.id

 

 

 

estrutura e dados para testes

 

CREATE TABLE IF NOT EXISTS acao (
  id_usuario int(3) NOT NULL ,
  data datetime NOT NULL ,
   KEY id_usuario (id_usuario)
);

INSERT INTO acao VALUES("1", "2009-03-05 00:00:00");
INSERT INTO acao VALUES("3", "2009-03-15 00:00:00");
INSERT INTO acao VALUES("5", "2009-04-05 00:00:00");
INSERT INTO acao VALUES("7", "2009-01-05 00:00:00");
INSERT INTO acao VALUES("1", "2009-02-05 00:00:00");

CREATE TABLE IF NOT EXISTS usuario (
  id int(3) NOT NULL auto_increment,
  nome char(50) NOT NULL ,
  PRIMARY KEY (id),
  UNIQUE KEY id (id),
   KEY id_2 (id)
);


INSERT INTO usuario VALUES("1", "A");
INSERT INTO usuario VALUES("2", "B");
INSERT INTO usuario VALUES("3", "C");
INSERT INTO usuario VALUES("4", "D");
INSERT INTO usuario VALUES("5", "E");
INSERT INTO usuario VALUES("6", "F");
INSERT INTO usuario VALUES("7", "G");
INSERT INTO usuario VALUES("8", "H");
INSERT INTO usuario VALUES("9", "I");
INSERT INTO usuario VALUES("10", "J");
INSERT INTO usuario VALUES("11", "H");
INSERT INTO usuario VALUES("12", "I");
INSERT INTO usuario VALUES("13", "K");

 

 

resultado

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom apenas substitui o que passou pelos dados das tabelas e nao funcionou

 

essa consulta deveria retornar 14 resultados e como colocou retornou 68

 

analisando os dados recuperados com a sua recuperamos na verdade a primeira acao dos membros e nao a ultima por isso o numero de resultados foi maior pois mesmo os que tem acoes recentes se tem acoes com mais de um mes cairão no filtro

 

mas creio que agora a adaptação seja mais simples

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mário, veja se resolve:

SELECT DISTINCT ACAO.ID_USUARIO, NOME, FROM_UNIXTIME(DATA) 
FROM USUARIO INNER JOIN ACAO ON USUARIO.ID = ACAO.ID_USUARIO 
WHERE FROM_UNIXTIME(DATA) > DATE_SUB(NOW(), INTERVAL 1 MONTH
ORDER BY FROM_UNIXTIME(DATA) DESC

 

Se não resolver, posta a SQL das tabelas com alguns dados para que eu possa testar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o patrao precisa de vodka...

 

 

 

SELECT U.ID, U.NOME , A.DATA

FROM

USUARIO U ,

(Select ID, MAX(data) data from Acao group by ID ) A

WHERE

U.ID NOT IN

(

SELECT ID FROM USUARIO INNER JOIN ACAO ON USUARIO.ID = ACAO.ID_USUARIO WHERE FROM_UNIXTIME(DATA) > DATE_SUB(NOW(), INTERVAL 1 MONTH))

)

AND U.ID = A.ID

ORDER BY A.DATA ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

A consulta do hargon buscou tudo no banco de acoes deu quase 4000 resultados e deveriam ser apenas 14

 

giesta voce chegou a testar a sua?

 

é que deu erro de sintaxe no fim da sql

 

Você tem um erro de sintaxe no seu SQL próximo a ') AND U.ID = A.ID ORDER BY A.DATA ASC ' na linha 9

Compartilhar este post


Link para o post
Compartilhar em outros sites

A consulta que o giesta postou tem um parêntese fechando a mais no WHERE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa

 

nem observei isso

 

testarei aqui para ver se agora vai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz que vacilo o meu de não ter visto este parentese a mais

 

Obrigado pela observação hargon

 

e muitíssimo obrigado giesta ficou perfeito

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.