[MySQL] Wie gewisse Punkte mit SELECT rausfiltern.

Blutschlumpf

Fleet Admiral
Registriert
März 2001
Beiträge
20.642
Gegeben ist ein phpBB Forum.

Code:
mysql> describe posts;
+-----------------+-----------------------+------+-----+---------+----------------+
| Field           | Type                  | Null | Key | Default | Extra          |
+-----------------+-----------------------+------+-----+---------+----------------+
| post_id         | mediumint(8) unsigned |      | PRI | NULL    | auto_increment |
| topic_id        | mediumint(8) unsigned |      | MUL | 0       |                |
| forum_id        | smallint(5) unsigned  |      | MUL | 0       |                |
| poster_id       | mediumint(8)          |      | MUL | 0       |                |
| post_time       | int(11)               |      | MUL | 0       |                |
| poster_ip       | varchar(8)            |      |     |         |                |
| post_username   | varchar(25)           | YES  |     | NULL    |                |
| enable_bbcode   | tinyint(1)            |      |     | 1       |                |
| enable_html     | tinyint(1)            |      |     | 0       |                |
| enable_smilies  | tinyint(1)            |      |     | 1       |                |
| enable_sig      | tinyint(1)            |      |     | 1       |                |
| post_edit_time  | int(11)               | YES  |     | NULL    |                |
| post_edit_count | smallint(5) unsigned  |      |     | 0       |                |
| post_attachment | tinyint(1)            |      |     | 0       |                |
+-----------------+-----------------------+------+-----+---------+----------------+
14 rows in set (0.00 sec)

mysql> describe posts_text;
+--------------+-----------------------+------+-----+---------+-------+
| Field        | Type                  | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+-------+
| post_id      | mediumint(8) unsigned |      | PRI | 0       |       |
| bbcode_uid   | varchar(10)           |      |     |         |       |
| post_subject | varchar(60)           | YES  |     | NULL    |       |
| post_text    | text                  | YES  |     | NULL    |       |
+--------------+-----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

Nun wollte ich ne Art Vorschau der letzten Posts machen (wie z.B. bei CB rechts auf der Seite).
Code:
select p.post_id, p.topic_id, pt.post_subject from posts p, posts_text pt WHERE p.post_id=pt.post_id ORDER BY topic_id DESC, p.post_id ASC;
Mein Problem ist, dass ich jetzt noch nen Filter brauche, der mir doppelte topic_id rausfiltert, und zwar so, dass der Datensatz mit der kleinsten post_id bleibt.

Mit DISTINCT gehts nicht, mit ner Kombi aus ORDER BY und LIMIT klappts auch nicht.
Wenn ich mit Group BY ASC/DESC versuche bekomm ich immer die Sätze mit der höchsten post_id statt der niedrigsten.

Da gibts doch sicher ne coole Lösung für, denn ich wollte das nicht über php oder ne Hilfstabelle machen. ;)



Edit: Kommando zurück, meine Lösung war Bullshit.
 
Zuletzt bearbeitet:
Ach verdammte Schnellantwort - wenn man ausversehen auf die Zurück-Taste drückt und dann wieder auf Vorwärts ist der gesamte Post wech. Kein Bock das jetzt nochmal neu zu schreiben ... kurzversion:

Code:
SELECT p.post_id, p.topic_id, pt.post_subject, MIN(p.post_id) as 'kleinste_post_id'
FROM posts p, posts_text pt
WHERE p.post_id=pt.post_id
ORDER BY topic_id DESC, p.post_id ASC
GROUP BY p.topic_id;
 
Zuletzt bearbeitet:
Ähh, nein.

Group vor order geht nicht, syntaxfehler, wenn ich umstelle ist es ausfürbar:
Code:
SELECT p.post_id, p.topic_id, pt.post_subject, MIN(p.post_id) as 'kleinste_post_id'
FROM posts p, posts_text pt
WHERE p.post_id=pt.post_id
GROUP BY p.topic_id
ORDER BY topic_id DESC, p.post_id ASC;

Liefert aber nicht das was ich suche.
Das scheint den letzten post der letzten themen zu liefern, ich such aber den ersten post der themen, in denen zuletzt gepostet wurde, vielleicht hab ich mich auch nur dumm ausgedrückt.


Habs ungeduldig wie ich bin gerade mit PHP gemacht, weil ichs auch mit ner Hilfstabelle nicht hinbekommen hab :heul::

PHP:
$result=mysql_query("SELECT topic_id FROM posts GROUP BY topic_id DESC ORDER BY post_id DESC LIMIT 5;");
while ($lasttopics = mysql_fetch_array($result))
{
  $topic=mysql_fetch_array(mysql_query("select p.post_id, p.topic_id, pt.post_subject from posts p, posts_text pt WHERE p.post_id=pt.post_id AND p.topic_id =".$lasttopics["topic_id"]." ORDER BY p.post_id ASC LIMIT 1;"));
  echo "<a href=\"http://forum.tawp.de/viewtopic.php?t=".$lasttopics["topic_id"]."\">".$topic["post_subject"]."</a><br />";
}
 
Zuletzt bearbeitet:
Ja - das GROUP BY kommt vor dem ORDER BY ... mein Fehler.

Es ist zwar spät - aber soweit ich das beurteilen kann - funktioniert das:
Code:
SELECT p.post_id, p.topic_id, pt.post_subject,
MIN(p.post_id) as 'erster',
MAX(p.post_id) as 'letzter'
FROM posts p, posts_text pt
WHERE p.post_id=pt.post_id
GROUP BY topic_id
ORDER BY post_id DESC

Ich werd das gleich mal testen sobald ich mir die tabellen zusammengefummelt hab.

Edit:
Also bei mir tut es. Siehe Anhang. Links die erfundene Post-Reihenfolge und rechts das SQL-Ergebnis.
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    28 KB · Aufrufe: 287
Zuletzt bearbeitet:
Probieren kannste dir sparen, soweit ich das sehe funktioniert das mit "ORDER BY letzter DESC;" :)

Danke, dann werd ich das morgen direkt mal optimieren.

Wenns noch Karma gäb, würdest du jetzt welches bekommen.
Kannst dafür kostenlos bei mir zocken ;): http://tawp.de/servers.php
 
Zurück
Oben