phpbar.de logo

Mailinglisten-Archive

[php] OT: MySQL for / while Schleife

[php] OT: MySQL for / while Schleife

Michael Borchers list at tridemail.de
Fre Jul 27 10:12:39 CEST 2007


>>>> Ich habe verschiedene Status 1-X. Zu jedem Status werden verschiedene
>>>> COUNT()s durchgeführt, z.B.
>>>> SELECT COUNT(foo) FROM bar WHERE status = X
>>>> Besteht die Möglichkeit in MySQL 5 eine Schleife zu konstruieren, à la
>>>> FOR(i=0;i<X;i++) {
>>> <    SELECT COUNT(foo) FROM bar WHERE status = i
>>>
>>> eventuell damit
>>>
>>> CREATE PROCEDURE p ()
>>> BEGIN
>>>  DECLARE i INT DEFAULT 0;
>>>  WHILE i < 5 DO
>>>    SELECT * FROM v;
>>>    SET i = i + 1;
>>>    ALTER VIEW v AS SELECT 2;
>>>  END WHILE;
>>> END;
>>>
>>> Gruß
>>> Wolfgang Skupin
>>
>> Ich glaube diese Zusammenstellung würde meinen Zweck erfüllen. Leider 
>> läuft
>> bei uns imme noch MySQL 5.0.:(
>> Ich werde es aber mal auf 5.1 testen. Worin liegt der Vorteil der 
>> PROCEDURE,
>> denn ich denke die normale
>> WHILE Schleife würde mir schon reichen?!
>
> die WHILE-Schleife gibt es nunmal nur in einer PROCEDURE ... ;-)
>
> aber ich denk wie die anderen schon vorgeschalgen haben, das du das mit
> GROUP BY und eventuell 'derived tables' (subselects) lösen kannst
>
>
> -- 
> Sebastian

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)
    }
}

usw., natürlich wird auch noch auf Monat und Jahr geprüft. D.h. also Pro Tag 
werden jeweils 5 COUNT()s für die Status ausgeführt.
Bei 31 Tagen sind das also 31*5=155 COUNT()s in einer Query.

Nicht gerade schön, aber bis jetzt die einzige Lösung alles in einem Result 
zu erhalten. Würde die PROCEDURE das ganze wesentlich
schöner und performanter lösen?

Sorry, ich weiss, ganz schöne unschöne Query;) 


php::bar PHP Wiki   -   Listenarchive