phpbar.de logo

Mailinglisten-Archive

[php] OT: MySQL for / while Schleife

[php] OT: MySQL for / while Schleife

Sebastian Mendel lists at sebastianmendel.de
Mon Jul 30 11:55:35 CEST 2007


Michael Borchers schrieb:
> 
> 
>> 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;)

yepp, und genau das meine ich - SQL holt die Daten, PHP bringt sie in Form

zumal das auch relativ einfach ist

$data = array(
    '03.08.2007' => array(
        'status 1' => 2,
        'status 2' => 1,
        ...,
    ),
    '04.08.2007' => ...,
);

welches du dann ganz einfach auslesen kannst während du über alle Tage und
Status iterierst


>> 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.

eben, so sollte es auch sein denn Theoretisch kannst du dein gesamte
Anwendung in das DBMS verschieben - aber das ist eigentlich nicht die
Aufgabe des DBMS

Aber das ist auch so ne Glaubenssache - ab wann gehört das ins DBMS oder in
die Anwendung ... ich würde das nicht im DBMS machen ...


-- 
Sebastian

php::bar PHP Wiki   -   Listenarchive