Данный практикум предназнaчен для усвоения ER, SQL, запросов в области Web.
Рассмотрим обычный блог. В блоге есть:
Это основные сущности, каждой из которых будет соответствовать таблица в mysql.
Таким образом к трем таблицам сущностей добавляется четвертая - смежная таблица тэги-к-постам
Опишем структуру таблиц:
CREATE DATABASE blog;
use blog
post
CREATE table post (
post_id SERIAL,
post_title VARCHAR(255),
post_text TEXT,
post_create_datetime DATETIME,
post_update_datetime TIMESTAMP
);
Вставим тестовые данные в таблицу:
INSERT INTO post SET
post_title = 'subject',
post_text = "text body",
post_create_datetime = NOW();
поля post_id
и post_update_datetime
заполнятся автоматически;
Добавьте несколько записей с осмысленными названиями и текстом.
comment
CREATE TABLE `comment` (
`comment_id` SERIAL,
`post_id` bigint(20) DEFAULT NULL,
`comment_parent_id` bigint(20) DEFAULT NULL,
`comment_username` varchar(255) DEFAULT NULL,
`comment_text` text,
`comment_datetime` TIMESTAMP
);
comment.post_id
post_id
из тех или иных постов). Так же добавьте
ответные комментарии к комментариям, т. е. задайте comment_parent_id
. Оставьте один пост без комментариев для понимания различий между
INNER JOIN
и LEFT JOIN
post_id
= 2INNER JOIN
(используя USING(post_id)
или ON (post.post_id = comment.post_id)
) или WHERE
из таблицы постов и комментов,
Отметьте для себя отсутствие поста без комментов в выборке.LEFT JOIN
, который выведет все посты, и комменты к ним, включая тот, у которого нет комментов.AS
и comment_parent_id
GROUP BY
и count(comment.comment_id)
.MAX
и MIN
по полю comment_datetime
tag
CREATE TABLE `tag` (
tag_id SERIAL,
tag_title VARCHAR(128)
)
Добавьте разных тэгов.
post_to_tag
Эта таблица предназначена для организации связи тэга и поста:
CREATE TABLE post_to_tag(
post_to_tag_id SERIAL,
post_id BIGINT,
tag_id BIGINT
);
post_id
и tag_id
LEFT JOIN
от таблицы post
к таблице tag
через смежную таблицу post_to_tag
GROUP BY
подсчитайте количество тэгов у всех постов в колонке под именем tagsCount
. Используйте AS
для задания псевдонимов.GROUP BY
выведите все тэги для каждого поста в поле tagsList
. Используйте GROUP_CONCAT
для объединения тэгов в одну строку.WHERE
и какой-то tag_title
. Отсортируйте выборку по дате в обратном порядке (самые свежие посты - вверху).