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 09:51:53 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 ... ;-)

Abfragen tust du mit einem Query in SQL

bekommen tust du die Daten mit dem bereits genannten Query

Formatieren tust du das mit deiner Middleware, in diesem Fall PHP

einfach die Fehlenden Tage/Status durch 0 ersetzen bei der Ausgabe


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

Was aber, wie geschrieben, eigentlich nicht Sache der DB ist ...

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

-- 
Sebastian

php::bar PHP Wiki   -   Listenarchive