【问题标题】:Getting the last record inserted into a select query获取插入到选择查询中的最后一条记录
【发布时间】:2009-04-04 20:04:50
【问题描述】:

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

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

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

【问题讨论】:

  • 还需要什么?收到最后一条消息?
  • 这是我第一次来这里,所以我不知道我这样做是否正确 基本上,我需要该查询,但需要一个额外的字段,即用户名、日期/时间和主题所以我想到了一个嵌套查询

标签: mysql


【解决方案1】:

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

【讨论】:

  • 这适用于获取消息表的最后一篇文章,但我如何将它与我的原始查询结合起来?
  • 这看起来正是我正在尝试做的,但我收到此错误消息 #1064 - 您的 SQL 语法有错误。检查与您的 MySQL 服务器版本相对应的手册,以了解在 'select count(message) from messages m where m 附近使用的正确语法。 topicid = t .
  • 对不起,这是标准SQL,但我对mysql不太了解。也许它不支持字段列表中的子查询。或者它可能对它们有不同的语法。
  • 如果你做类似“WHERE field=(SELECT etc”的事情是一个子查询,因为如果是,我的mysql版本确实支持它我不知道为什么它不接受你建议的一切跨度>
  • 另一个 SELECT 中的每个 (SELECT ... ) 都是一个子查询。大多数数据库允许在主查询的 FROM 或 WHERE 部分进行子查询,但并非所有数据库都允许在 SELECT 的字段列表中进行子查询。你试过我发布的最后一个版本吗?
【解决方案2】:

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

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

【讨论】:

  • 我在消息表中有一个时间戳字段
【解决方案3】:

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

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)

【讨论】:

  • 这假定 id 字段对于找到最大的是有意义的。如果是 GUID 怎么办?
  • 好吧,我只是做了一个疯狂的猜测,因为我不知道表结构。该查询看起来会略有不同,但它仍然是一个子查询。
【解决方案4】:

对于 MySQL,这应该可以工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2015-07-24
    • 2012-01-25
    • 2013-12-31
    • 2013-11-23
    • 2012-06-24
    相关资源
    最近更新 更多