Написать запрос к СУБД MySQL

132
26 января 2022, 03:30

Доброго времени суток уважаемые форумчане! В программировании MySQL совсем новичок. Нужно написать SQL-запрос к СУБД MySQL, который выбрал из базы данных пользователей и их последние комментарии (по одному комментарию на каждого пользователя), при следующих таблицах:

CREATE TABLE `db_user` 
( `db_user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`balance` DECIMAL(10,2) NOT NULL,
PRIMARY KEY (`db_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE `db_comment` (
`db_comment_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`db_user_id` INT(10) UNSIGNED NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`db_comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Запрос, который мне удалось написать:

SELECT MAX(com.text), us.name FROM `db_comment` AS com, `db_user` AS us ;
WHERE com.db_user_id=us.db_user_id ORDER com.text;

не учитывает ситуацию, когда есть пользователи, у которых комментариев нет вообще - они не выведутся, а должны. Помогите пожалуйста исправить.

Answer 1

Вам понадобится MAX(), но применить его надо к db_comment_id — это лучший кандидат на определение "последнего комментария" в вашей структуре, где нет поля с датой-временем.

Если сгруппировать по пользователю (т.е. по db_user_id), то MAX(db_comment_id) вычислит соответственно последние комментарии каждого пользователя, если они писали комментарии.

Чтобы учесть возможность отсутствия комментария, используйте LEFT JOIN, а чтобы обойти любимую новичками ошибку группировки, примените JOIN дважды: один раз для вычисления MAX(), второй для получения любых полей из таблицы комментариев.

SELECT u.db_user_id, u.name, u.balance, c2.text FROM db_user AS u
LEFT JOIN (
  SELECT db_user_id, MAX(db_comment_id) AS db_comment_id 
  FROM db_comment
  GROUP BY db_user_id
) AS c1 ON u.db_user_id = c1.db_user_id
LEFT JOIN db_comment AS c2 ON c2.db_comment_id = c1.db_comment_id
ORDER BY u.name ASC

http://sqlfiddle.com/#!9/f8992d/46

Answer 2

Такой:

SELECT users.*, comments.text FROM db_user AS users
LEFT JOIN 
  (SELECT * FROM 
    (SELECT * FROM 
      db_comment AS c 
      ORDER BY c.db_comment_id DESC
    ) AS cs 
    GROUP BY db_user_id DESC
  ) AS comments 
ON comments.db_user_id = users.db_user_id
READ ALSO
Как из таблицы БД извлечь последнюю добавленную запись?

Как из таблицы БД извлечь последнюю добавленную запись?

Можно ли это сделать с помощью LIMIT? Или можно ли извлечь запись у которой самый большой id, так как у каждой строки он автоинкемируемый, а значит...

111
Как лучше хранить данные

Как лучше хранить данные

Приветствую всех и поздравляю с наступающим Новым годом)

151
Prompt при изменении innerHTML-a выдает undefined

Prompt при изменении innerHTML-a выдает undefined

Всем добра и мира! Знаете в чем может быть ошибка? Функция editPrompt при вызывании выдает undefined

232
Валидация в Vue и bootstrap-vue

Валидация в Vue и bootstrap-vue

Делаю валидацию полей в VueПодключен bootstrap-vue, который имеет встроенную кривую валидацию, которая работает не так как нужно, то есть высвечивает...

125