Выбрать сообщения с их коментариями - MySQL
Формулировка задачи:
Привет всем. Прошу помощи.
Имееться 2 таблицы:
Имееться запрос который делает сгрупированную выборку:
Как написать запрос что бы к каждому сгрупированому сообщению что мы выбираем добавлялся массив его коментариев? В данном случае когда я делаю еще один ДЖОИН то добавляеться всего 1 комментарий (Мне нужно что бы все.). Помогите пожалуйста!
CREATE TABLE IF NOT EXISTS `recognition` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `id_host` INT(11) NOT NULL COMMENT 'кто', `id_client` INT(11) NOT NULL COMMENT 'кому', `message` VARCHAR(120) CHARACTER SET cp1251 NOT NULL, `bonus` VARCHAR(60) CHARACTER SET cp1251 NOT NULL, `bonus_img` VARCHAR(155) CHARACTER SET utf8 NOT NULL, `department` VARCHAR(88) CHARACTER SET utf8 DEFAULT NULL, `likes` INT(11) NOT NULL, `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4342 ; CREATE TABLE IF NOT EXISTS `recog_comments` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `id_recog` INT(11) NOT NULL, `id_user` INT(11) NOT NULL, `comment` VARCHAR(250) CHARACTER SET cp1251 NOT NULL, `likes` INT(11) NOT NULL, `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=52 ;
SELECT r.*, r.date DATE, u.email, s.name_en name_from, s.sapphoto host_photo, s.function_en from_func, COUNT(rc.comment) comments, rc.likes likes_comment, u.email email_from FROM recog r LEFT JOIN USER u ON u.id = r.id_host LEFT JOIN _sap s ON s.sapemail = u.email LEFT JOIN recog_comm rc ON r.id = rc.id_recog WHERE r.department IS NOT NULL GROUP BY r.date ORDER BY r.date DESC
Решение задачи: «Выбрать сообщения с их коментариями»
textual
Листинг программы
SELECT r.*, r.DATE DATE, u.email, s.name_en name_from, s.sapphoto host_photo, s.function_en from_func, COUNT(rc.comment) comments, rc.likes likes_comment, u.email email_from, (SELECT Group_Concat(rcom.coments SEPARATOR '; ') FROM recog_comments rcom WHERE rcom.id_recog=r.id) AS comentts FROM recog r LEFT JOIN USER u ON u.id = r.id_host LEFT JOIN _sap s ON s.sapemail = u.email LEFT JOIN recog_comm rc ON r.id = rc.id_recog WHERE r.department IS NOT NULL GROUP BY r.DATE ORDER BY r.DATE DESC
Объяснение кода листинга программы
В представленном коде выполняется запрос к базе данных с использованием языка SQL. Этот запрос имеет следующую структуру:
- SELECT - выбираются нужные поля из таблиц.
- FROM - указываются таблицы, из которых берутся данные.
- WHERE - задаются условия для отбора данных.
- GROUP BY - группировка данных по определенному полю.
- ORDER BY - сортировка данных по определенному полю. По порядку:
- В блоке SELECT выбираются следующие поля:
- r.* - все поля из таблицы recog (кроме id).
- r.DATE - дата из таблицы recog.
- u.email - email из таблицы USER.
- s.name_en - имя из таблицы _sap.
- s.sapphoto - фото из таблицы _sap.
- s.function_en - функция из таблицы _sap.
- COUNT(rc.comment) - количество комментариев (без учета кавычек) из таблицы recog_comm.
- rc.likes - количество лайков (без учета кавычек) из таблицы recog_comm.
- u.email - email из таблицы USER.
- (SELECT Group_Concat(rcom.coments SEPARATOR '; ') FROM recog_comments rcom WHERE rcom.id_recog=r.id) AS comentts - список комментариев, объединенных по id записи (без учета кавычек).
- В блоке FROM указываются таблицы, из которых берутся данные:
- recog - таблица, из которой берутся основные данные.
- USER - таблица, из которой берется email.
- _sap - таблица, из которой берутся имя, фото и функция.
- recog_comm - таблица, из которой берутся данные о комментариях и лайках.
- В блоке WHERE задаются условия для отбора данных:
- r.department IS NOT NULL - выбираются только записи, у которых есть отдел.
- В блоке GROUP BY группируются данные по дате.
- В блоке ORDER BY данные сортируются по дате в обратном порядке. Следует отметить, что данный код может быть не полностью корректным, так как не указаны некоторые важные детали, такие как имена таблиц и полей, а также не указаны кавычки вокруг названий и значений переменных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д