Mysql abfrage optimieren

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
rox²³
Mitglied
Beiträge: 347
Registriert: 24.07.2003 15:18
Wohnort: Schmölln
Kontaktdaten:

Mysql abfrage optimieren

Beitrag 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
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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?
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
rox²³
Mitglied
Beiträge: 347
Registriert: 24.07.2003 15:18
Wohnort: Schmölln
Kontaktdaten:

Beitrag 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^^
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17412
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Beitrag von Dr.Death »

Hi,

vor dem ORDER BY:

Code: Alles auswählen

GROUP BY topid
?
Benutzeravatar
rox²³
Mitglied
Beiträge: 347
Registriert: 24.07.2003 15:18
Wohnort: Schmölln
Kontaktdaten:

Beitrag von rox²³ »

Ja danke das funktioniert schon mal aber jetzt ließt er nur den thread aus der das älteste datum hat.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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;
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
rox²³
Mitglied
Beiträge: 347
Registriert: 24.07.2003 15:18
Wohnort: Schmölln
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17412
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Beitrag 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
?
Benutzeravatar
rox²³
Mitglied
Beiträge: 347
Registriert: 24.07.2003 15:18
Wohnort: Schmölln
Kontaktdaten:

Beitrag 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. ^^
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Code: Alles auswählen

SELECT MAX(id), topid FROM thread_tabelle GROUP BY topid;
So?
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Antworten

Zurück zu „Coding & Technik“