MySQL - Abfrage vereinfachen
Ich habe hier 2 SQL Befehle die in einer Schleife ausgeführt werden. Die Schleife hatt 100 und mehr durchläufe! Dem entsprechen dauert das generieren der Seite auch ein wenig.
Als ersten führ ich ein normalen "SELECT id, datei" aus auf einer Tabelle. Die läuft dann in der Schleife durch und gibt diese aus. Aber ich brauche noch 2 Werte. Und deswegen habe ich noch 2 Abfragen in der Schleife. Die sehen so aus:
Gibt es eine möglichkeit das einfacher/schneller zu lösen so das der Server schneller die Ergebnisse liefert?
Als ersten führ ich ein normalen "SELECT id, datei" aus auf einer Tabelle. Die läuft dann in der Schleife durch und gibt diese aus. Aber ich brauche noch 2 Werte. Und deswegen habe ich noch 2 Abfragen in der Schleife. Die sehen so aus:
// $row->id ist die ID die von dem "SELECT *" kommt.
$sql = sprintf("SELECT COUNT(id) as votes FROM votes WHERE trackid='%d' LIMIT 1", $row->id);
$sql = sprintf("SELECT COUNT(id) as anz FROM votes WHERE trackid='%d' AND ip='%s' LIMIT 1", $row->id, md5($_SERVER['REMOTE_ADDR']));
Gibt es eine möglichkeit das einfacher/schneller zu lösen so das der Server schneller die Ergebnisse liefert?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 93420
Url: https://administrator.de/forum/mysql-abfrage-vereinfachen-93420.html
Ausgedruckt am: 08.04.2025 um 07:04 Uhr
8 Kommentare
Neuester Kommentar
Moin EvilMoe,
geht es nicht mit einem SubSelect?
Grüße
Biber
P.S. Ist natürlich nur getippt, nicht getestet....
geht es nicht mit einem SubSelect?
SELECT t.id, t.datei, v1.votes, v2.anz
From tabelle t,
(select trackid, count(id) as votes from votes
group by trackid ) v1,
(select trackid, ip, count(id) as Anz from votes
group by trackid, ip ) v2
Where
t.id = v1.trackid and
t.id = v2.trackid and
v2.ip = md5($_SERVER['REMOTE_ADDR']);
Grüße
Biber
P.S. Ist natürlich nur getippt, nicht getestet....
Moin EvilMoe,
Wenn Du auch die Sätze ohne Child-Summen (bzw. mit Summe 0) brauchst, dann klappt es mit dem Inner Join (alle Sätze, die in allen verknüpften Tabellen sind) natürlich nicht.
Das hatte ich falsch verstanden bzw. interpretiert.
Grüße
Biber
Ich bin leider nicht so ein SQL Freak...
Ich auch nicht - ich kann auch in meiner Küche viel pfiffigere Sachen zusammenbraten als hier im Forum...Wenn Du auch die Sätze ohne Child-Summen (bzw. mit Summe 0) brauchst, dann klappt es mit dem Inner Join (alle Sätze, die in allen verknüpften Tabellen sind) natürlich nicht.
Das hatte ich falsch verstanden bzw. interpretiert.
$sql = "SELECT t.id, t.datei,
Case when v2.votet is null then 0
else v1.votes
end as votes,
, Case when v2.votet is null then 0
else v2.votet
end as votet
FROM tracks as t
LEFT JOIN
(SELECT trackid, COUNT(id) as votes
FROM votes GROUP BY trackid) as v1 on t.id = v1.trackid
Left Join
(SELECT ip, trackid, COUNT(id) as votet
FROM votes
Where ip = '".md5($_SERVER['REMOTE_ADDR'])."'
GROUP BY trackid, ip ) as v2 on t.trackid=v2.id";
Grüße
Biber
Moin EvilMoe,
Jepp, so habs ich umgesetzt. Und nach Deiner letzten Beschreibung tut es das ja - works as designed.
Wenn "votes" immer als votes-Wert angezeigt werden soll, dann logischerweise statt des ersten CASE-Geraffels einfach "votes" schreiben.
Und bitte diesen Beitrag auf "erledigt" setzen.
Danke
Biber
Man bekommt nur ein Ergebnis wenn die IP übereinstimmt. Muss aber auch gehen wenn sie nicht übereinstimmt (dann soll votes=0 sein und votet auch).
Jepp, so habs ich umgesetzt. Und nach Deiner letzten Beschreibung tut es das ja - works as designed.
Wenn "votes" immer als votes-Wert angezeigt werden soll, dann logischerweise statt des ersten CASE-Geraffels einfach "votes" schreiben.
Und bitte diesen Beitrag auf "erledigt" setzen.
Danke
Biber