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
Hi,

vor dem ORDER BY:

Code: Alles auswählen

GROUP BY topid
?

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:

Code: Alles auswählen

ORDER BY posttime DESC
änderst in:

Code: Alles auswählen

ORDER BY posttime ASC
?

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?