Seite 1 von 2
Mysql abfrage optimieren
Verfasst: 02.03.2007 11:28
von rox²³
Code: Alles auswählen
$read_last_thread_info = mysql_query("SELECT id, forid, subfor, topid, user, posttime, text, date_format(posttime, '%d.%m.%y - %H:%i') AS form_posttime FROM ".$praefix."threads WHERE subfor='".$subforid."' ORDER BY posttime DESC");
Jeder thread hat ne topid (Topic Id) ich bekomme also alle threads angezeigt.
Allerdings möchte ich immer den letzte Thread der jeweiligen topid ausgegebeen bekommen. Wie mache ich das? Limit iss ja schwachsinn weil ich dann nicht alle threads mit allen topids bekomme.
Hat jemand ne ahnung was man da machen kann das ich immer nur den letzten Thread der jeweiligen topid bekomme.
Meine Tabellen Strucktur sieht so aus das man sich mal ein Bild machen kann:
Threads
Code: Alles auswählen
id forid subfor topid user posttime text post_flag
311 98 0 104 100 2007-02-26 02:17:03 1 0
312 98 0 105 100 2007-02-26 02:18:50 2 0
313 98 0 104 100 2007-02-26 02:19:35 1 0
Verfasst: 02.03.2007 12:48
von Miriam
Wie soll die topid einer thread_id zugeordnet werden? Das gibt Deine Tabelle nicht her. Hast Du die Struktur vllt soweit normalisiert, dass die Zuordnung in einer anderen Tabelle stattfindet?
Und habe ich Dich richtig verstanden, dass Du zu der jeweiligen topid die Thre4ad_id gefunden werden soll?
Und warum ist topid kein Index?
Verfasst: 02.03.2007 14:17
von rox²³
Miriam hat geschrieben:Wie soll die topid einer thread_id zugeordnet werden? Das gibt Deine Tabelle nicht her. Hast Du die Struktur vllt soweit normalisiert, dass die Zuordnung in einer anderen Tabelle stattfindet?
Ja findet in einer anderen Tabelle statt.
Miriam hat geschrieben:
Und habe ich Dich richtig verstanden, dass Du zu der jeweiligen topid die Thre4ad_id gefunden werden soll?
Nein ich lese alle threads aus der Tabelle ich möchte lediglich nur das wenn Threads auftauchen die die gleiche topid haben nur eine die jeweils letzte vom datum datetime her ausgelesen wird.
Miriam hat geschrieben:
Und warum ist topid kein Index?
Sorry die Frage kapier ich nicht ganz^^
Verfasst: 02.03.2007 14:25
von Dr.Death
Verfasst: 02.03.2007 14:43
von rox²³
Ja danke das funktioniert schon mal aber jetzt ließt er nur den thread aus der das älteste datum hat.
Verfasst: 02.03.2007 17:50
von Miriam
Ich verstehe den Zusammenhang zwischen Deinen Threads und der topid immer noch nicht. Wahrscheinlich bin ich einfach nur zu doof dafür.
Generell sollte es so un der Art laufen:
Code: Alles auswählen
SELECT MAX(datetime), topid FROM thread_tabelle WHERE topid = thread_id GROUP BY topid;
Verfasst: 02.03.2007 18:24
von rox²³
Miriam hat geschrieben:Ich verstehe den Zusammenhang zwischen Deinen Threads und der topid immer noch nicht. Wahrscheinlich bin ich einfach nur zu doof dafür.
Der zusammenhang ist eigentlich egal. Aber wenn dus wuissen willst. Die Topid ist die id von der Tabelle Topics die enthält die Topic Titel die Threads sind die eigentlichen Beiträge
. Um jetzt auszulesen wer als letzter zu welchem Topic gepostst hat und wann das war ordne ich die Threads zu den Topics ich brauch natürlich das jeweilige letzte. Aber logischerweise ja nur einmal das letzte von dem jeweiligen Topic und nicht das letzte vorletzte ...etc.
Miriam hat geschrieben:
Generell sollte es so un der Art laufen:
Code: Alles auswählen
SELECT MAX(datetime), topid FROM thread_tabelle WHERE topid = thread_id GROUP BY topid;
Mit dieser Methode liefert er mir zwar das letzte datum aber der eigentliche Thread inhalt bleibt der gleiche und das ist in meinem fall der erste.
Und topid = thread_id trifft eigentlich nie zu da diese Ids in keinem Zusammenhang stehen außer in threads um an den Topic content heranzukommen.
Verfasst: 02.03.2007 18:35
von Dr.Death
Und was ist, wenn du das:
änderst in:
?
Verfasst: 02.03.2007 18:53
von rox²³
dann ändert sich nur die anordnung der insgesammt ausgelesenen threads aber nicht die auf oder absteigende aktuellen threads eines Topics. Was wiederum anderes ist wenn ich GROUP BY weglasse.
ZUsammengefasst. Group by liefert zwar die daten ohne die mehrfach ausgelesenen Threads eines Topics (wo ich ja nur den letzten aktuellsten haben möchte) Ohne group by hab ich alle threads eines einzigen topics + alle anderen aber die sortierung des letzten threads funktioniert. ^^
Verfasst: 02.03.2007 18:56
von Miriam
Code: Alles auswählen
SELECT MAX(id), topid FROM thread_tabelle GROUP BY topid;
So?