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

(Resolvido) Select de datas corridas, mesmo sem registros


antonio max

Pergunta

Ola pessoal

Estou querendo pegar os registros (paginados) do banco, para datas corridas, resultado mais ou menos assim:

29-01-2009 - Registro X

29-01-2009 - Registro Y

30-01-2009 - Nenhum registro encontrado

31-01-2009 - Registro X

01-02-2009 - Registro X

Hoje já faco, porem ele não me retorna dias onde não são encontrados registros....ele me retorna somente:

29-01-2009 - Registro X

29-01-2009 - Registro Y

31-01-2009 - Registro X

01-02-2009 - Registro X

Eu poderia resolver na aplicacao o 'problema', porem, como a lista tem de ser completa, com todas as datas, acaba ficando chato.

E tambem existe a possibilidade de paginacao por data, por exemplo, se o user clicar em dia 25/02/2009, a paginacao ocorre a partir deste dia nos registros, porem se não houver registros para o dia 25/02/2009, ele deveria retornar 25-02-2009 - Nenhum registro encontrado, 26-02-2009 - Registro X.... and so on...

Tem como fazer direto pelo mysql?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Oi,'antonio max'

Mostre o select para que possamos analisar.

Ok, aqui esta..é mais ou menos isso aqui:

$this->db->select("
                    GROUP_CONCAT(DISTINCT events_dates.dt_start,'<->',events_dates.dt_end) AS event_dates,
                    u.name AS autor,
                    events.post_title, events.uid, events.title, events.content, events.ticket, events.time_related, 
                    events.place AS espaco_cultural_id, p.full_name AS espaco_cultural_nome,
                    g.image1, g.image2, g.image3, g.label AS area_cultural
                    FROM events                                        
                    INNER JOIN categories_relations AS c ON c.item_id = events.uid AND c.area_id = " . $areaID . "                     
                    LEFT OUTER JOIN places AS p ON (p.uid = events.place)
                    INNER JOIN categories_global AS g ON g.main_module = " . $areaID . " AND g.uid = c.cat_id
                    INNER JOIN users AS u ON u.uid = events.author
                    INNER JOIN events_dates ON events.uid = events_dates.item_id AND events_dates.area_id = " . $areaID . "", FALSE);
        // group by event id for the GROUP_CONCAT function
        $this->db->groupby('events_dates.uid');
        // Limit query for just one event category
        if ($this->fetch_from_cat) {            
            $this->db->where('c.cat_id', $catID);
        }
        // Select only events from this date
        if ($this->selected_date) {
            $this->db->where('events_dates.dt_start', $this->selected_date);
        }
        // Select only events from this date and beyond
        if ($this->selected_date_from) {
            $this->db->where('events_dates.dt_start >= "' . $this->selected_date_from . '"', NULL, FALSE); 
        }

O ultimo db where events_dates é onde eu seto a data start :)

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'antonio max'!

Consegui uma solução que passou por uma tabela temporária (pode ser uma tabela normal).

Primeiro criei uma storage procedure que cria e carrega a tabela

DELIMITER $$;

DROP PROCEDURE IF EXISTS `test`.`Gera_data`$$

CREATE PROCEDURE `test`.`Gera_data` (data_ini date)
BEGIN
   DROP TEMPORARY TABLE IF EXISTS `test`.`Gera_data`;
   CREATE TEMPORARY TABLE `test`.`Gera_data`(
      DATA date NOT NULL,
      PRIMARY KEY (DATA)
   );
   WHILE data_ini <= NOW() DO
      INSERT INTO `test`.`Gera_data`(DATA)
      VALUES (data_ini);
      SET data_ini = INTERVAL 1 DAY + data_ini;
   END WHILE;
END$$

DELIMITER;$$
Segundo: Executei a SP:
call gera_data('2007-01-01');
Terceiro: Adaptei seu select com uma tabela que tenho:
SELECT gd.data , GROUP_CONCAT(g.dia, ' ') AS event_dates
from sase.guia g
RIGHT JOIN gera_data gd ON g.dia = gd.data
WHERE gd.data between '2007-01-01' and '2007-12-31'
GROUP BY gd.data;

Explicando:

gd.data = vai mostrar todas as datas do intervalo;

GROUP_CONCAT(g.dia, ' ') AS event_dates = é o seu GROUP_CONCAT adaptado a minha tabela guia;

RIGHT JOIN gera_data gd ON g.dia = gd.data = Faz com que o MySQL leia primeiro a tabela gera_data para depois ler a tabela guia. Voce deverá colocar esta cláusula, adaptando os nomes dos campos aos seus, após a instrução INNER JOIN events_dates ON events.uid = events_dates.item_id AND .... Esta instrução vai trazer as todas as datas geradas e, na segunda coluna, NULL, quando não houver equivalente na sua tabela (no meu caso a tabela guia).

Tenta e nos informe o progresso.

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,2k
    • Posts
      652k
×
×
  • Criar Novo...