phpbar.de logo

Mailinglisten-Archive

[php] OT: MySQL for / while Schleife

[php] OT: MySQL for / while Schleife

Michael Borchers list at tridemail.de
Mon Jul 30 11:40:04 CEST 2007




> Michael Borchers schrieb:
>>> Michael Borchers schrieb:
>>>> Aha! Ich hab es nun etwas "unschön" probiert, in dem ich die Query mit
>>>> php
>>>> zusammensetze. Das ergibt eine
>>>> gigantische Query bestehend aus diversen COUNT()s. Die Abfrage dauert
>>>> über
>>>> phpMyAdmin um die 5 Sekunden.
>>>>
>>>> Die Query setzte sich ungefährt wiefolgt zusammen:
>>>> for(alle Tage t des jeweiligen Monats) {
>>>>     for(Status s, 5 an der Zahl) {
>>>>         SELECT
>>>>         COUNT(foo) FROM bar WHERE DAYOFMONTH(date) = t
>>>>         AND status = s
>>>>         AS (individueller Name wie count_s_t)
>>>>     }
>>>> }
>>
>> Hier wie versprochen ein paar Datensätze:
>>
>> history_id  history_status_id      history_date
>> history_description      contacts_id
>> 14760       1                            2007-08-01 08:00:00      Status 
>> 1,
>> 1.8.               1
>> 14761       1                            2007-08-01 08:00:00      Status 
>> 1,
>> 1.8.               2
>> 14762       2                            2007-08-01 08:00:00      Status 
>> 2,
>> 1.8.               1
>> 14763       3                            2007-08-01 08:00:00      Status 
>> 3,
>> 1.8.               1
>> 14764       3                            2007-08-03 08:00:00      Status 
>> 3,
>> 3.8.               2
>> 14765       3                            2007-08-03 08:00:00      Status 
>> 3,
>> 3.8.               1
>> 14766       5                            2007-08-03 08:00:00      Status 
>> 5,
>> 3.8.               1
>>
>> Die Schleife soll nun für alle 31 August-Tage wiefolgt durchlaufen: 
>> (optisch
>> für php dargestellt,
>> wie gesagt ist die SQL Klausel Lösung gesucht;) )
>>
>> for($d=1;$d<32;$d++) {
>>
>>     for($s=1;$s<6;$s++) {
>>
>>         SELECT
>>         COUNT(history_id)
>>         FROM history
>>         WHERE 1
>>         AND DAYOFMONTH(history_date)    = $d
>>         AND MONTH(history_date)                = 8
>>         AND YEAR(history_date)                    = 2007
>>         AND history_status_id                        = $s
>>
>>     }
>>
>> }
>>
>> Dabei soll für jeden Tag eine Row ausgegeben werden. In jeder Row stehen
>> dann die COUNT()s für alle Status.
>>
>> Optisch:
>> Datum            COUNT status 1    COUNT status 2    COUNT status 3 
>> COUNT
>> status 4    COUNT status 5
>> 01.08.2007    2                            1 
>> 1
>> 0                            0
>> 02.08.2007    0                            0
>> 0                            0                            0
>> 03.08.2007    0                            0
>> 2                            0                            1
>>
>> Das habe ich so trotz Tipps noch nicht hingekriegt;(
>
> SQL ist eine Abfragesprache - keine Ausgabeformatiersprache ... ;-)

Das war auch nur zur Verdeutlichung, wie die Row aus dem Result später 
zusammengesetzt sein soll;)

>
> wenn du es wirklich unbedingt in der Datennank lösen willst, brauchst du
> entweder PROCEDUREs oder total verschachtelte JOINS und IF
>

Dann warte ich auf MySQL 5.1 ;)

>
> und außerdem bezweifle ich das du mit deinem "gigantischen Query" obiges
> Ergebnis erhalten hast ...

In der Tat habe ich nur alle einzelnen COUNT()s bekommen, keine einzelnen 
Rows mit Datum:(
Den Rest habe ich dann mit php aufgelöst.

>
> -- 
> Sebastian

Danke! 


php::bar PHP Wiki   -   Listenarchive