1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Faço isto em SQL ou no PHP???

Discussão em 'Programação' iniciada por LuisPitbull, 21 de Fevereiro de 2008. (Respostas: 9; Visualizações: 1398)

  1. LuisPitbull

    LuisPitbull Power Member

    Boas pessoal. Então é o seguinte.

    Tenho uma tabela de chamadas com um campo de DATA e quero criar uma array com todos os dias do mês (mesmo não existindo esse dia como registo na tabela) e apresentar a soma de todas as chamadas nesse dia.

    Já tenho o SQL que devolve a contagem das chamadas e separa campos de mês e dia.

    Passando aos exemplo.

    Neste a query que tenho devolve uma array com os seguintes dados:
    Código:
     
    mes: 02 | dia: 01 | total_chamadas: 30
    mes: 02 | dia: 05 | total_chamadas: 25
    mes: 02 | dia: 06 | total_chamadas: 28
    mes: 02 | dia: 08 | total_chamadas: 32
    
    Mas eu quero que os dias em falta (que não tem registos) sejam apresentados a "0".
    A array que eu quero criar deverá apresentar-se assim:
    Código:
     
    mes: 02 | dia: 01 | total_chamadas: 30
    mes: 02 | dia: 02 | total_chamadas: 00 *
    mes: 02 | dia: 03 | total_chamadas: 00 *
    mes: 02 | dia: 04 | total_chamadas: 00 *
    mes: 02 | dia: 05 | total_chamadas: 25
    mes: 02 | dia: 06 | total_chamadas: 28
    mes: 02 | dia: 07 | total_chamadas: 00 *
    mes: 02 | dia: 08 | total_chamadas: 32
     
    *- Estes registos não existem na base de dados mas queria que fossem criados com o valor "0"
    
    Não sei se me fiz entender :/
     
  2. K0mA

    K0mA Power Member

    Boas,

    Como dizes que os registos não existem na base de dados isto não deve dar mas se adicionares AND WHERE total_chamadas >= 0

    A segunda opção que eu tou a ver era construires um array em php com todos os dias e meses com valor do total_chamadas = 0;

    Depois era fazer pegar nos resultados da query e inseri-los no array!
     
  3. LuisPitbull

    LuisPitbull Power Member

    Pois foi exactamente isso que eu tb pensei mas estou com algumas duvidas a faze-lo.

    Já tenho o código para devolver o mes actual:
    Código:
    $mesActual=date('m');
    Já tenho o código para devolver o ano actual:
    Código:
    $anoActual=date('y');
    Já tenho o código que devolve o numero total de dias do mes actual:
    Código:
    $diasMesActual = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
    Mas não sei como fazer o resto...isto é, como criar uma array que vai procurar na base de dados se existe registos (e quantos) para um determinado dia de um determinado mês.

    Teoricamente sei mas programáticamente não.

    Já pensei fazer uma tabela de calendário onde tem todos os dias do ano e depois fazer uma comparação com a tabela de chamadas...
     
  4. K0mA

    K0mA Power Member

    Hummmmmmm...

    Fazes um array "à mão" com uma estrutura destas:

    >mes 1
    >>dia 1 => total_chamadas
    >>dia 2 => total_chamadas
    >>...
    >>dia n => total_chamadas

    >mes 2
    >>dia 1 => total_chamadas
    >>dia 2 => total_chamadas
    >>...
    >>dia n => total_chamadas

    onde total_chamadas é sempre 0;

    Em alternativa fazes um script que cria o array (só para não fazer à mão os dias todos do ano apesar de ser fácil)
    Após teres o array:

    Fazes a query normalmente que irá devolver:

    mes: 02 | dia: 01 | total_chamadas: 30
    mes: 02 | dia: 05 | total_chamadas: 25
    mes: 02 | dia: 06 | total_chamadas: 28
    mes: 02 | dia: 08 | total_chamadas: 32

    depois para cada linha da query é só percorreres o array criado e entrar o mês dessa linha, uma vez encontrado procuras pelo dia dessa linha depois é só fazer total_chamadas(do array criado) = total_chamadas(da query), todos os outros são 0.
     
  5. LuisPitbull

    LuisPitbull Power Member

    Koma, seguindo o teu concelho teria de criar uma função total_chamadas("data) que ia ser chamado para cada dia na array?

    Humm...tb me parece boa ideia...vou experimentar :)
     
  6. K0mA

    K0mA Power Member

    Com ou sem função precisas é de percorrer o array criado e inserires os dados que não estão lá ou seja os dados da query.
     
  7. slack_guy

    slack_guy Power Member

    Não tens de percorrer o array (isso seriam 365 ciclos)

    Não sei como fazer em PHP, mas com certeza que é possível juntar arrays.

    Tens dois arrays (A -> Todos os dias do ano; B -> resultado da consulta à BD), ambos com a mesma estrutura de dados.
    No final, sobrepões o ArrayB ao ArrayA e tens o ArrayC com a estrutura de dados devidamente preenchida.

    Se o PHP não faz isto, muda de linguagem ;-)
     
  8. Warlord

    Warlord [email protected] Member

    kando extrais os dados da bd mete num array associativo onde a chave e a data e o valor o numero de chamadas

    dps fazes um ciclo desde o 1º dia ate X, se a posicao do array para esse dia nao existir, adicionas a 0.

    para ir avancando na data c/ strtotime("+1 day") ou ir avancando c/ unixtimestamp + 86400
     
    Última edição: 21 de Fevereiro de 2008
  9. K0mA

    K0mA Power Member

    A solução da função para fazer merge aos dois arrays não está errada a questão é que não sei até que ponto é que que a função array_merge funciona bem.

    Podes tentar
    http://pt2.php.net/array
     
  10. jotinhapt

    jotinhapt Power Member

    Há varias soluções em PHP para isso. Podes criar um array multidimensional com 366 posições nulas e vais preenchendo:

    Depois, imprimes:
    Em resumo, as chamadas sao distribuidas em funcao do dia do ano e como cada dia/mes é calculado com base no indice da matriz, estão lá todos, com ou sem chamadas.
    ;)
     
    Última edição: 21 de Fevereiro de 2008

Partilhar esta Página