2009-04-06 17 views
0

Dies ist ein auf ein anderes Problem Follow-up i mit getting-the-last-record-inserted-into-a-select-query hatteden letzten Datensatz der Tabelle erhalten in Auswahlabfrage

Ich versuche, eine Abfrage zu bearbeiten, die Andrea war so freundlich, mich mit gestern zu helfen, die für eine einwandfrei funktioniert Seite, aber ich versuche, eine ähnliche Abfrage ohne viel Glück zu erstellen.

Was muss ich für jedes Board ist das Board Name angezeigt werden, die Anzahl der Themen und zu diesem Board verknüpften Nachrichten und dem Benutzer, Thema und Datum der letzten Meldung (die Arbeit der Fall ist)

Was i Notwendigkeit ist die Platine Namen zu erhalten, das Thema und die Nachricht zählen

Dies ist meine Tabellenstruktur

CREATE TABLE `boards` (
    `boardid` int(2) NOT NULL auto_increment, 
    `boardname` varchar(255) NOT NULL default '', 
    PRIMARY KEY (`boardid`) 
); 

CREATE TABLE `messages` (
    `messageid` int(6) NOT NULL auto_increment, 
    `topicid` int(4) NOT NULL default '0', 
    `message` text NOT NULL, 
    `author` varchar(255) NOT NULL default '', 
    `date` datetime(14) NOT NULL, 
    PRIMARY KEY (`messageid`) 
); 

CREATE TABLE `topics` (
    `topicid` int(4) NOT NULL auto_increment, 
    `boardid` int(2) NOT NULL default '0', 
    `topicname` varchar(255) NOT NULL default '', 
    `author` varchar(255) NOT NULL default '', 
    PRIMARY KEY (`topicid`) 
); 

und die Abfrage, die ich mit auf der Grundlage der Abfrage gekommen sind, die Andrea für mich getan hat. Was diese Abfrage im boardname ausgibt, die Anzahl der Themen und Nachrichten (wobei 1 angegeben wird, obwohl es 5 gibt), der Themenautor und der Nachrichtenzähler (der nicht benötigt wird), der Autor und das Datum des letzten Posts (der benötigt wird), aber nicht der Name des Themas, die

SELECT b.boardname, count(DISTINCT t.topicname) AS topics, count(lm.message) AS message, t.author as tauthor, 

     (select count(message) from messages m where m.topicid = t.topicid) AS messagecount, 
     lm.author as lauthor, lm.date 
    FROM topics t 
    INNER JOIN messages lm 
    ON lm.topicid = t.topicid AND lm.date = (SELECT max(m2.date) from messages m2) 
    INNER JOIN boards b 
    ON b.boardid = t.boardid 
    GROUP BY t.topicname 

das ist meine ursprüngliche Abfrage benötigt wird, das tut, was ich wollte, aber den ersten Beitrag erhalten, nicht das letzte

SELECT b.boardid, b.boardname, count(DISTINCT t.topicname) AS topics, count(m.message) AS message, m.author AS author, m.date AS date, t.topicname AS topic 
FROM boards b 
INNER JOIN topics t ON t.boardid = b.boardid 
INNER JOIN messages m ON t.topicid = m.topicid 
INNER JOIN (

SELECT topicid, MAX(date) AS maxdate 
FROM messages 
GROUP BY topicid 
) test ON test.topicid = t.topicid 
GROUP BY boardname 
ORDER BY boardname 

jede Hilfe bei diesem sehr geschätzt

Antwort

2
SELECT b.*, m.*, t,* 
     (
     SELECT COUNT(*) 
     FROM topics ti 
     WHERE ti.boardid = b.boardid 
     ) AS topiccount, 
     (
     SELECT COUNT(*) 
     FROM topics ti, messages mi 
     WHERE ti.boardid = b.boardid 
       AND mi.topicid = ti.topicid 
     ) AS messagecount 
FROM boards b 
LEFT JOIN 
     messages m 
ON  m.messageid = (
     SELECT mii.messageid 
     FROM topics tii, messages mii 
     WHERE tii.boardid = b.boardid 
       AND mii.topicid = tii.topicid 
     ORDER BY 
       mii.date DESC 
     LIMIT 1 
     ) 
LEFT JOIN 
     topics t 
ON  t.topicid = m.topicid 
+0

Genau das habe ich versucht. Nur eine letzte Frage, wie bekomme ich den Spitznamen aus der Tabelle Themen, die ich denke, würde mit der Themen-ID und Autorenname verknüpft werden? – AdRock

+0

Siehe aktualisierten Beitrag – Quassnoi

5

Sie müssen "LAST" im Sinne einer ORDER BY-Klausel definieren. Sobald Sie das getan haben, können Sie einfach die Richtung Ihrer Bestellung umkehren und LIMIT 1 der Abfrage hinzufügen.

Verwandte Themen