我正在制作一个小留言板而且我被困了
我可以选择主题,原作者,回复的数量,但我不能做的是获取上一篇文章的用户名,主题或日期。
有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`)
);
答案 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;