Получение последней записи, вставленной в запрос на выборку - PullRequest
0 голосов
/ 05 апреля 2009

Я создаю небольшую доску объявлений и застрял

Я могу выбрать тему, оригинального автора, количество ответов, но я не могу получить имя пользователя, тему или дату последнего сообщения.

Есть 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 ]

2 голосов
/ 05 апреля 2009

, если ваш 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 голос
/ 05 апреля 2009

Если вы хотите получить самую последнюю запись в таблице, у вас должно быть поле DateTime, которое показывает, когда запись была создана (или обновлена). Затем вы можете отсортировать этот столбец и выбрать самый последний.

Но если ваше поле id является числом, вы можете найти самое высокое. Но я бы рекомендовал против этого, потому что он делает много предположений, и в будущем вам будут назначены числовые идентификаторы.

1 голос
/ 05 апреля 2009

Вы можете использовать подвыбор. Eg.:

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

edit: И если вы идентифицируете новейшую запись по метке времени, вы будете использовать:

select * from messages where id = (
  select id
  from messages
  order by post_time desc
  limit 1)
0 голосов
/ 05 апреля 2009

С MySQL это должно работать:

SELECT author, date, topicname as topic FROM messages LEFT JOIN topics ON messages.topicid = topics.topicid ORDER BY date DESC, LIMIT 0, 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...