将最后一条记录插入到选择查询中

时间:2009-04-04 20:04:50

标签: mysql

我正在制作一个小留言板而且我被困了

我可以选择主题,原作者,回复的数量,但我不能做的是获取上一篇文章的用户名,主题或日期。

有3个表格,主板,主题和消息。

我想获取消息表中最后一条消息的作者,日期和主题。作者和日期字段已经是消息表上的字段,但我需要加入topicid字段上的消息和主题表。

这是我的查询,选择主题,作者和回复数量

SELECT t.topicname, t.author, count( message ) AS message
  FROM topics t
  INNER JOIN messages m
    ON m.topicid = t.topicid
  INNER JOIN boards b
    ON b.boardid = t.boardid
  WHERE b.boardid = 1
  GROUP BY t.topicname

有人可以帮我完成这个吗?

这就是我的表格的样子

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

4 个答案:

答案 0 :(得分:2)

如果您的SQL支持LIMIT子句,

SELECT m.author, m.date, t.topicname FROM messages m 
JOIN topics t ON m.topicid = t.topicid 
ORDER BY date desc LIMIT 1

否则:

SELECT m.author, m.date, t.topicname FROM messages m 
JOIN topics t ON m.topicid = t.topicid 
WHERE m.date = (SELECT max(m2.date) from messages m2)

编辑:如果要将其与原始查询结合使用,则必须使用子查询重写它以提取邮件计数和最后一条消息的日期:

SELECT t.topicname, t.author, 
      (select count(message) from messages m where m.topicid = t.topicid) AS messagecount, 
       lm.author, 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
  WHERE b.boardid = 1
  GROUP BY t.topicname

另请注意,如果您不从桌面选择任何字段,则不需要最后一次加入:

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

编辑:如果mysql不支持字段列表中的子查询,可以试试这个:

SELECT t.topicname, t.author, mc.messagecount, lm.author, lm.date
  FROM topics t
  JOIN (select m.topicid, count(*) as messagecount from messages m group by m.topicid) as mc 
    ON mc.topicid = t.topicid
  JOIN messages lm
    ON lm.topicid = t.topicid AND lm.date = (SELECT max(m2.date) from messages m2)
  WHERE t.boardid = 1
  GROUP BY t.topicname

答案 1 :(得分:1)

您可以使用子选择。例如:

select * from messages where id = (select max(id) from messages)

编辑:如果您通过时间戳识别最新记录,则使用:

select * from messages where id = (
  select id
  from messages
  order by post_time desc
  limit 1)

答案 2 :(得分:1)

如果要获取表格中的最新条目,则应该有一个DateTime字段,用于显示创建(或更新)条目的时间。然后,您可以对此列进行排序并选择最新的列。

但如果您的id字段是数字,则可以找到最高数字。但我建议不要这样做,因为它做了很多假设,你将来会修复数字ID。

答案 3 :(得分:0)

使用MySQL,这应该有效:

SELECT author, date, topicname as topic FROM messages LEFT JOIN topics ON messages.topicid = topics.topicid ORDER BY date DESC, LIMIT 0, 1;