Jump to content


Photo

Visitantes Recentes


  • Faça o login para participar
3 replies to this topic

#1 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 17/02/2010, 11:40

Bom dia,

Estou com um problema para listar os visitantes recentes, no meu sistema

Tenho a seguinte tabela:
CREATE TABLE `recente` (
  `id` int(11) NOT NULL auto_increment,
  `de` int(11) NOT NULL,
  `para` int(11) NOT NULL,
  `dh` datetime NOT NULL,
  PRIMARY KEY  (`id`)
)


Meio óbvio, mas vamos a explicação:
"de" é o ID do usuário que fez a visita
"para" é o ID do usuário que foi visitado
"dh" é a data e hora

Alguns dados:
INSERT INTO `recente` (`id`, `de`, `para`, `dh`) VALUES
(1, 1, 2, '2010-02-17 09:10:17'),
(2, 1, 2, '2010-02-17 09:10:49'),
(3, 1, 2, '2010-02-17 09:11:55'),
(5, 2, 1, '2010-02-17 09:13:13'),
(6, 2, 1, '2010-02-17 09:17:20'),
(7, 1, 2, '2010-02-17 09:27:30'),
(8, 1, 2, '2010-02-17 09:30:04'),
(9, 1, 2, '2010-02-17 09:36:10'),
(10, 1, 2, '2010-02-17 09:38:11'),
(11, 1, 3, '2010-02-17 09:41:46'),
(12, 3, 2, '2010-02-17 09:41:47');

SQL atual:
SELECT DISTINCT(de), para, id, dh 
FROM recente 
WHERE para=3
GROUP BY de
ORDER BY dh DESC

O problema é que quando seleciona os ultimos visitantes, ele não pega os ultimo realmente.
Deve ser algum conflito entre o DISTINCT e o ORDER BY, sei lá.

Alguma sugestão?
<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 17/02/2010, 14:49

O problema não é o DISTINCT, mas sim o GROUP BY. Ele fará com que retorne o primeiro registro distinto que encontrar, a ordenação será feita depois, nos registros agrupados...

Desde então, para ter o resultado da forma que deseja, você precisa agrupar pelo campo `de' os dados ordenados por `dh'. Você pode fazer com uma inline view (também chamada de tabela derivada), que é essa query no FROM, que traduz para SQL o que eu acabei de explicar como resolver:

SELECT t.de, t.para, t.id, t.dh
  FROM (
    SELECT de, para, id, dh
      FROM recente
      ORDER BY dh DESC
  ) t
  GROUP BY t.de

Só para lhe informar, apesar de você poder fazer:

DISTINCT (campo1), campo2, campo3 ...

O DISTINCT não é realizado avaliando somente o campo1, mas sim todos os listados no SELECT. Como você quer por um campo, dos citados no SELECT, o MySQL lhe permite citar somente alguns campos do SELECT no GROUP BY (mas não espere este comportamento em outros SGBD, como Oracel, SQL Server, etc). Apesar de fazer mais do que um DISTINCT, no fim das contas. (Como GROUP BY está vinculado a agregações, i.e. SUM, MAX, MIN, AVG, etc)
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 Falci

Falci

    12 Horas

  • Usuários
  • 187 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 17/02/2010, 23:43

Intendi. Mas agora tenho outro problema.
Estava procurando, mas não encontrei tbm.

Estou usando Zend Framework, e não sei como fazer essa consulta.
<?php /* falci at Falci.me */

$naoAcrediroQueEuFizUmaVariavelTaoGrandeSoParaGuardarUmTres = 3;
?>

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 18/02/2010, 18:54

Então se ainda estiver com este problema, favor criar um novo tópico sobre o mesmo na seção Frameworks de PHP. ;)
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq