Mysql 获取插入到select查询中的最后一条记录

Mysql 获取插入到select查询中的最后一条记录,mysql,Mysql,我正在创建一个小留言板,我被卡住了 我可以选择主题、原作者、回复数量,但我不能做的是获取上一篇文章的用户名、主题或日期 共有3个表、板、主题和消息 我想获取消息表中最后一条消息的作者、日期和主题。“作者”和“日期”字段已经是messages表中的字段,但我需要加入topicid字段中的messages和topics表 这是我选择主题、作者和回复数量的查询 SELECT t.topicname, t.author, count( message ) AS message FROM topics

我正在创建一个小留言板,我被卡住了

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

共有3个表、板、主题和消息

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

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

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

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

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)

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

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)

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


但是,如果您的
id
字段是一个数字,则可以找到最高值。但我建议您不要这样做,因为它会做出许多假设,并且您将来会固定为数字ID。

如果您想获取表中的最新条目,您应该有一个
DateTime
字段,显示条目创建(或更新)的时间。然后,您可以在此列上排序并选择最新的一列


但是,如果您的
id
字段是一个数字,则可以找到最高值。但我建议您不要这样做,因为它会做出许多假设,将来您将被固定为数字ID。

如果您的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

如果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

对于MySQL,这应该是可行的:

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

对于MySQL,这应该是可行的:

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

还需要什么?收到最后一条消息?这是我第一次来这里,所以我不知道我做的是否正确基本上,我需要那个查询,但需要一个额外的字段,它是用户名、日期/时间和主题,所以我想到了一个嵌套的查询还需要什么?收到最后一条消息?这是我第一次来这里,所以我不知道我是否做得对。基本上,我需要那个查询,但需要一个额外的字段,它是用户名、日期/时间和主题,所以我想到了一个嵌套的查询。这假设id字段可以找到最大的字段。如果是GUID呢?我只是随便猜了一下,因为我不知道表的结构。这个查询看起来会略有不同,但它仍然是一个子查询。这假设id字段可以找到最大的。如果是GUID呢?我只是随便猜了一下,因为我不知道表的结构。查询结果会略有不同,但它仍然是一个子查询。我在messages表中有一个timestamp字段。我在messages表中有一个timestamp字段,用于获取messages表的最后一篇文章,但我如何将其与原始查询组合?这看起来正是我试图做的,但我得到了这个错误消息#1064-您的SQL中有一个错误语法。检查与您的MySQL服务器版本对应的手册,以了解使用near'select count(message)from messages m where m的正确语法。抱歉,这是标准SQL,但我对mysql了解不多。也许它不支持字段列表中的子查询。或者它有不同的语法。如果你做了类似“WHERE field=(SELECT etc)”的事情,那就是子查询,因为如果是,我的mysql版本确实支持它。我不知道为什么它不接受你建议的所有内容(SELECT…)在另一个SELECT中是一个子查询。大多数数据库允许在主查询的FROM或WHERE部分中使用子查询,但并非所有数据库都允许在SELECT的字段列表中使用子查询。您是否尝试过我发布的上一个版本?该版本可用于获取messages表的最后一篇文章,但我如何将其与原始查询合并?看起来不错与我试图做的完全一样,但我收到了此错误消息#1064-您的SQL语法有错误。请查看与您的MySQL服务器版本对应的手册,以了解在“选择计数(消息)”附近使用的正确语法来自消息m,其中m.topicid=t。抱歉,这是标准SQL,但我对mysql了解不多。可能它不支持字段列表中的子查询。或者可能它有不同的语法。如果您执行类似“where field=(SELECT etc)”的操作这是一个子查询吗?因为如果是,我的mysql版本确实支持它。我不知道为什么它不接受您建议的所有内容(选择…)在另一个SELECT中是一个子查询。大多数数据库允许在主查询的FROM或WHERE部分进行子查询,但并非所有数据库都允许在SELECT的字段列表中进行子查询。您是否尝试过我发布的上一个版本?