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

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 :/
 
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!
 
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!
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...
 
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.
 
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 :)
 
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 ;-)
 
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:
Há varias soluções em PHP para isso. Podes criar um array multidimensional com 366 posições nulas e vais preenchendo:

$conn-=new MySQL();
...
$query_result=$conn->sql("SELECT dayofyear(data), chamadas");
while($aLinha = mysql_fetch_row($query_result) {
$nPos =$aLinha[0];
$aAno[$nPos+1] += $aLinha[0]; // incrementa chamadas
}
...
Depois, imprimes:
...
$conta=1;
while($dia = $aAno) {
echo "mes: ".date("M",$conta*24*60*60);
echo "dia: ".date("d",$conta*24*60*60);
echo "chamadas: ".$dia;
$conta ++;
}
...
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:
Back
Topo