[SQl] Anzahl der Beiträge mit timestamp des letzten abrufen.

Frieden den Palästinensern.
Ich verscuhe mit einem sql query die Anzahl aller Posts, die sich innerhalb
von 4 Themen befinden, zu ermitteln + den timestamp des letzten posts.
Mit diesem query bekomme ich als last_post_time aber NULL zurück...

Code:
SELECT COUNT(*) AS `count_posts`, MAX(time) AS `last_post_time`
FROM `sj_posts` WHERE `sub` IN (1, 2, 3, 4)
Und wie bekomme ich auch gleich noch die id des letzten posts zurück?

Tabelle sj_forums
Code:
CREATE TABLE `sj_forums` (
  `id` int(10) unsigned NOT NULL default '0',
  `sub` int(11) NOT NULL default '0',
  `pos` int(11) NOT NULL default '0',
  `liststyle_subforums` tinyint(1) NOT NULL default '1',
  `list_topics` tinyint(1) NOT NULL default '1',
  `title` text collate latin1_general_ci NOT NULL,
  `desc` text collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Tabelle sj_posts
Code:
CREATE TABLE `sj_posts` (
  `id` int(11) NOT NULL,
  `sub` int(11) NOT NULL,
  `time` int(11) NOT NULL,
  `autor_id` int(11) NOT NULL,
  `title` text collate latin1_general_ci NOT NULL,
  `text` text collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Also passende Suchbegriffe für Google fallen mir schonmal nicht ein.
 
Kann spontan auch nicht den Fehler in deiner Abfrage finden, es sei denn, der Zeitstempel ist tatsächlich überall NULL (was in der Tabellendefinition ja ausgeschlossen ist). Muss es denn unbedingt in einem Query passieren? Du könntest deine Abfrage sonst so bauen, dass sie dir alle gesuchten Datensätze zurückgibt:

Code:
SELECT `id`, `time`
FROM `sj_posts`
WHERE `sub` IN (1, 2, 3, 4)
ORDER BY `time` DESC

Dann hast du im ersten Ergebnis den Zeitstempel des letzten Beitrags sowie dessen ID und in der Größe des Resultsets (mysql_num_rows() in PHP z.B.) auch die Anzahl der Beiträge, auf die deine WHERE-Klausel zutrifft.
 
gibt es eigentlich auch Einträge mit 'sub'<=4 ? ;)
Und wie bekomme ich auch gleich noch die id des letzten posts zurück?
Code:
SELECT id FROM sj_posts WHERE time=(SELECT MAX(time) from sj_posts WHERE sub IN (1,2,3,4));
 
@bLaCk-DrAg0n
Weil ich den Zeitpunkt als timestamp speichern will.

@CDW
Dann bekomme ich ja die Anzahl des posts und den timestamp des letzten nicht mit.

@LX
Damit würde ich 100fach mehr daten abrufen als ich brauche.

Naja. Die Funktion war gedacht für die Forenauflistungsschleife meiner
Boardsoftware, die ich in Arbeit habe.
Jeder Schleifendurchlauf (pro Unterforum ja eins) würde eine
sql-Abfrage nach meiner Idee schicken und dann noch eine
für die auszugebenden Details wie Anzahl der topics,
dann in Folge noch ne Abfrage für die Anzahl der posts je topic,
id des letzten posts und time.

Das wäre ja schonmal pure Unterhaltung, eine satte Stunde
zu Lachen für die zukünftigen exploit-Sucher.
Anscheinend muss ich leider wie in phpbb die details der Anzahl
der Beiträge in einem topic in einer topics_post_total-Spalte
speichern sowie die gesamte Anzahl der posts in einem
Forum in einer forum_posts_total-Spalte...

So ein Schlag ins Gesicht!
Und ich dachte, als ich das Tabellendesign von phpbb 2 sah: Was ein Trash!
Tja, hätte ich ja vll auch richtig gelegen, wenn meine Forensoftware
auf eine Verschachtelungsebene begrenzt wäre...

Danke für eure Hilfe...
 
@CDW
Dann bekomme ich ja die Anzahl des posts und den timestamp des letzten nicht mit.
Dann nimmst du eben den timestamp mit in die SELECT Anweisung ;)
und COUNT würde extra ermitteln. Obwohl es so auch gehen sollte:
Code:
SELECT id,time,COUNT(SELECT id FROM sj_posts WHERE sub IN (1,2,3,4)) FROM sj_posts WHERE time=(SELECT MAX(time) FROM sj_posts WHERE sub IN (1,2,3,4));
alles auf einmal zu ermitteln ergibt immer so hässliche Verschachtelungen.
 
also ....
Code:
SELECT COUNT( `id` ) AS `post_num` , MAX( `time` ) AS `last_post`
FROM `sj_posts`
WHERE `sub`
IN ( 1, 2, 3, 4 ) ;
ist schonmal richtig so...

Code:
------------------------
| post_num | last_post |
| 12 	   | 123459    |
------------------------

also es sind insgesamt 12 post's gewesen wobei 4 davon die topics selbst sind und der rest sind halt antworten drauf...

weiss echt nich wo das prob liegt :X
 
@CDW

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT `id` FROM `sj_posts` WHERE sub IN (1,2,3,4))
FROM `sj_posts`
WHERE `t' at line 1

Mein erster query hier im topic funktioniert jetzt.
Lag wahrscheinlich an den fehlenden ` um time...
Somit haut Black_Dragon's Lösung hin..
 
Original von Friedrich
@CDW

#1064 - You have an error in your SQL syntax; check the manual that corresponds to
Sorry, habs nicht 'real' überprüft - sollte nur eine Idee sein.Hätte dazuschreiben sollen, dass ich bis jetzt nur mit DB2 gearbeitet habe - das hätte nämlich die Anfrage so wie gepostet geschluckt ;).
 
Gott, es wird immer härter mit SQL.
Fragt sich, wieso ich keine Doku dazu verstehe.

Code:
SELECT B.COUNT(*) AS `count_posts`, A.`id` AS `id`, A.`time` AS `time`, A.`autor_id` AS `autor_id`
FROM `sj_posts` A, `sj_posts` B
WHERE A.`sub`=1
ORDER BY A.`time` DESC
LIMIT 0, 1

Damit versuche ich nun, die Zeile mit dem größten timestamp
abzurufen mit samt `time`, `id` (id des Posts), `autor_id` (id des verfassers)
und gleich noch die Anzahl aller Beiträge im topic anzurufen.
Aber die Fehlermeldung hat schon Recht, dass das purer Bullshit ist.

Gibt es bei der MySql diese Möglichkeit überhaupt?
 
Zurück
Oben