2009-04-06 16 views
0

これは私がgetting-the-last-record-inserted-into-a-select-query選択クエリ内のテーブルの最後のレコードを取得することは

私はアンドレアが1のために正常に動作昨日で私を助けるために親切だったクエリを編集しようとしていますとしていた別の問題のフォローアップであります私は幸運なことなく類似のクエリを作成しようとしています。私はにするために必要なもの

は、すべてのボードは、そのボードにリンクされているトピックやメッセージの数と(仕事をする)最後のメッセージのユーザー、話題と日付をボード名を表示するためにある

何I必要性は、これは私のテーブル構造

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`) 
); 

と私はアンドレアが私のためにしたクエリに基づくが出ているクエリで話題とメッセージ数

、ボード名を取得することです。ボード名、トピックとメッセージの数(5があっても1と表示されます)、トピックの著者とメッセージの数(必要ではない)、最後の投稿の著者と日付)ではなく

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 

私が望んでいたが最初のポストを得る。この私の元のクエリではなく、最後の

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 

この感謝

答えて

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

これはまさに私がやろうとしていたものです。 ちょうど最後の質問ですが、どのように私はトピックのIDと著者の名前にリンクされると思いますトピックテーブルからtopicnameを取得するのですか? – AdRock

+0

更新された投稿を表示 – Quassnoi

5
を持つ任意の助けが必要であるトピック名

ORDER BY句の観点から、 "LAST"を定義する必要があります。いったんこれを行うと、注文の方向を逆にしてLIMIT 1をクエリに追加することができます。

関連する問題