Optimierung von Datenbankabfragen
Optimierung von Datenbankabfragen
am 14.10.2006 17:40:28 von usenet
Hallo,
ich hätte hier eine kleine Frage zur Optimierung einiger
Datenbankabfragen in PHP die mich über eine Bekannte ereilen. Ich
selber habe mich mit PHP nicht genug auseinandergesetzt als das ich
gleich beurteilen könnte welche Möglichkeiten es hier noch gibt.
Für mich scheint es so bzw. wie sie auch im unten zitierten Bereich
beschreibt. Das sie eine Art Schleife benötigt die eben das endlose
kopieren per Copy&Paste verhindert und den Code verkürzt. Falls jemand
ohne weitere Angaben auf Anhieb einen Tipp geben kann was sie sich
anschauen könnte um es zu optimieren oder wie man es machen könnte
wäre schon sehr geholfen.
Falls weitere Informationen benötigt werden, werde ich natürlich
schauen was sich machen lässt.
Anbei der zitierte Text des Problems:
"Btw...stehe grad aufm Schlauch...das hier kann ich doch bestimmt
irgendwie mit ner Schleife
machen oder?
Naja falls jemand auf Anhieb weiß, wies einfacher geht, kann er es mir
sagen...wenn nicht mache ich einfach die nächste Stunde lang
C&P&Ersetzen :P
$sql =3D "SELECT count( ID ) AS GesAnz FROM tbl_survey_user;";
$ergebnis =3D mysql_query($sql);
$ganz=3D mysql_fetch_assoc($ergebnis);
$sql1_1 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest1' AND answer =3D1);";
($ergebnis1_1 =3D mysql_query($sql1_1);
$quest1_1 =3D mysql_fetch_assoc($ergebnis1_1);
$width1_1 =3D ($quest1_1['Anzahl']*100)/$ganz['GesAnz'];)den Teil müsste
ich ja sonst unter jedes SELECT setzen O.O ist doch irgendwie
schwachsinnig oder?
$sql1_2 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest1' AND answer =3D2);";
$sql1_3 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest1' AND answer =3D3);";
$sql1_4 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest1' AND answer =3D4);";
$sql1_5 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest1' AND answer =3D5);";
$sql1_6 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest1' AND answer =3D6);";
$sql2_1 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest2' AND answer =3D1);";
$sql2_2 =3D "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
(quest =3D 'quest2' AND answer =3D2);";
..........geht weiter bis $sql6_6
Sinn und Zweck von dem Scheiss ist die Ausgabe von nem hübschen
Balken...
$width;?>px; background-color: #FFBE7D;"> "
Re: Optimierung von Datenbankabfragen
am 14.10.2006 18:10:41 von Frank Schenk
usenet@broken-world.net schrieb:
^^^^^^^^^^^^^^^^^^^^^^
Im Usenet ist der RL Name üblich
> $sql1_2 = "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
> (quest = 'quest1' AND answer =2);";
> $sql1_3 = "SELECT count( ID ) AS Anzahl FROM tbl_survey_answers WHERE
> (quest = 'quest1' AND answer =3);";
Du suchst "group by" - siehe Handbuch: http://dev.mysql.com/doc
Frank
Re: Optimierung von Datenbankabfragen
am 14.10.2006 19:32:24 von usenet
Frank Schenk schrieb:
> Im Usenet ist der RL Name üblich
Oh, das war mir bewusst aber ich hab wohl vergessen gehabt es in Google
Groups einzustellen. Verzeihung.
> Du suchst "group by" - siehe Handbuch: http://dev.mysql.com/doc
Scheinbar hatte sie "Group By" schon versucht und kam damit wohl nicht
zu dem erforderlichen Ergebnis.
Die SQL Abfragen sind wohl auch weniger das Problem als das was man
vielleicht noch durch eine Schleife per PHP oder ähnlichem sparen
könnte. Wobei falls man die SQL Abfragen noch optimieren könnte wäre
das trotzdem interssant. Um mal zu veranschaulichen zu was das ganze
führen soll hab ich mir mal einen Screenshot geben lassen und ihn
hochgeladen:
http://marco.stormbind.net/screen.jpg
Falls dies doch mit "Group By" möglich sein sollte, und es nicht zu
komplex ist wäre ich für einen genaueren Hinweis dankbar.
Gruß,
Marco
Re: Optimierung von Datenbankabfragen
am 14.10.2006 22:46:08 von Johannes Vogel
Hi Frank
usenet@broken-world.net wrote:
> Frank Schenk schrieb:
>> Im Usenet ist der RL Name üblich
> Oh, das war mir bewusst aber ich hab wohl vergessen gehabt es in Google
> Groups einzustellen. Verzeihung.
Dann hättest du das jetzt machen können.
>> Du suchst "group by" - siehe Handbuch: http://dev.mysql.com/doc
> Scheinbar hatte sie "Group By" schon versucht und kam damit wohl nicht
> zu dem erforderlichen Ergebnis.
Kann 'sie' keine Newsgroups bedienen?
> Die SQL Abfragen sind wohl auch weniger das Problem als das was man
> vielleicht noch durch eine Schleife per PHP oder ähnlichem sparen
> könnte. Wobei falls man die SQL Abfragen noch optimieren könnte wäre
> das trotzdem interssant. Um mal zu veranschaulichen zu was das ganze
> führen soll hab ich mir mal einen Screenshot geben lassen und ihn
> hochgeladen:
> http://marco.stormbind.net/screen.jpg
> Falls dies doch mit "Group By" möglich sein sollte, und es nicht zu
> komplex ist wäre ich für einen genaueren Hinweis dankbar.
....
$sql = "select quest, answer, count(*) from tabelle";
$sql.= " group by quest,answer";
$res = mysql_query($sql);
while (list($dbquest,$dbanswer, $dbcnt) = mysql_fetch_array($res))
print "Question $dbquest has $dbcnt counts of answer $dbanswer.\n";
....
Das war jetzt nicht wirklich schwierig, oder?
RTM. Johannes
Re: Optimierung von Datenbankabfragen
am 15.10.2006 02:56:52 von Marco Schimmelpfennig
Johannes Vogel schrieb:
> > Oh, das war mir bewusst aber ich hab wohl vergessen gehabt es in Google
> > Groups einzustellen. Verzeihung.
>
> Dann hättest du das jetzt machen können.
Dachte ich auch gemacht zu habe, aber das waren scheinbar nur die
Angaben für Google intern an denen ich mein Name ausgefüllt hatte,
ich denke jetzt sollte er hoffentlich auch hier angezeigt werden,
ansonsten wüsste ich nicht wo das hier noch anzugeben wäre.
> Kann 'sie' keine Newsgroups bedienen?
Doch ich gehe wohl davon aus das sie könnte, nur momentan konnte sie
nicht.
> ...
> $sql =3D "select quest, answer, count(*) from tabelle";
> $sql.=3D " group by quest,answer";
> $res =3D mysql_query($sql);
> while (list($dbquest,$dbanswer, $dbcnt) =3D mysql_fetch_array($res))
> print "Question $dbquest has $dbcnt counts of answer $dbanswer.\n";
> ...
>
> Das war jetzt nicht wirklich schwierig, oder?
Ich hoffe mal nicht, bzw. damit es nicht zuviel Zeit gekostet hat.
Scheint wohl ein Denkanstoss zu sein, das einzige was spontan noch
nicht klar war wie sie dann die PHP Ausgabe so mit dem entsprechenden
HTML anreichern kann das ihre Ausgabe wie in der Grafik gewünscht mit
Antworten oben und Fragen links ausgeben kann.
Aber vielleicht klappt das noch von selbst. Falls sich noch jemand die
Zeit nehmen könnte und es doch nicht so komplex ist wäre das
natürlich schön.
Nach einem kurzen Test scheint die Ausgabe nicht wie erwartet
folgendermaßen zu sein:
frage1 antwort1 count(x)
frage1 antwort2 count(x)
...
frage1 antwort6 count(x)
...
frage6 antwort6 count(x)
sondern willkürlich zwischendrin ein paar der Zeilen wegzulassen. Ich
habe mich nochmal selbst versucht damit zu beschäftigen und nachdem
was ich über SELECT, GROUP BY sowie COUNT() gelesen habe kann ich das
Verhalten nicht nachvollziehen!?
Danke für euer beider Hilfe.
Gruß,
Marco
Re: Optimierung von Datenbankabfragen
am 15.10.2006 09:14:58 von Johannes Vogel
Hi Marco
Marco Schimmelpfennig wrote:
> Johannes Vogel schrieb:
>> ...
>> $sql = "select quest, answer, count(*) from tabelle";
>> $sql.= " group by quest,answer";
>> $res = mysql_query($sql);
>> while (list($dbquest,$dbanswer, $dbcnt) = mysql_fetch_array($res))
>> print "Question $dbquest has $dbcnt counts of answer $dbanswer.\n";
>> ...
[...]
> sondern willkürlich zwischendrin ein paar der Zeilen wegzulassen. Ich
> habe mich nochmal selbst versucht damit zu beschäftigen und nachdem
> was ich über SELECT, GROUP BY sowie COUNT() gelesen habe kann ich das
> Verhalten nicht nachvollziehen!?
Tja, diejenigen, die ausgelassen sind, sind in der DB nicht aufgeführt.
Man kann nur Existentes selektieren.
Man könnte das Ergebnis in ein Array ablegen, welches als Default-Werte
nullen beinhaltet und dieses dann erneut abarbeiten. Oder aber wie folgt
abarbeiten.
....
while (list($dbquest,$dbanswer, $dbcnt) = mysql_fetch_array($res))
$array[$dbquestion][$dbanswer]=$dbcnt;
for ($q=1;$q<=max(array_keys($array)); $q++) {
for ($a=1;$a<=max(array_keys($array[$q])); $a++) {
if (empty($array[$q][$a])) {
print "Question $q has no counts of answer $a.\n";
} else {
print "Question $q has $array[$q][$a] counts of answer $a.\n";
}
}
}
ungetestet..
Johannes
HTH; Johannes
Re: Optimierung von Datenbankabfragen
am 15.10.2006 21:51:25 von Marco Schimmelpfennig
Johannes Vogel schrieb:
> Tja, diejenigen, die ausgelassen sind, sind in der DB nicht aufgeführt.
> Man kann nur Existentes selektieren.
Ja, ist mir dann nach genauerem hinschauen und mich einlesen auch
aufgefallen also kein wirkliches Wunder.
> Man könnte das Ergebnis in ein Array ablegen, welches als Default-Werte
> nullen beinhaltet und dieses dann erneut abarbeiten. Oder aber wie folgt
> abarbeiten.
Der Ansatz hat es gebracht, vielen Dank. Nur der print musste leich
geändert werden da er sonst den $array Teil als String behandelt hat.
Vielen Dank für die Hilfe & Mühe.
Gruß,
Marco