Ситуация
Как некоторые из вас, возможно, уже знают из моих предыдущих вопросов, в настоящее время я занимаюсь разработкой системы блогов.
На этот раз я застрял в получении всех сообщений из определенной категории, с их категорией.
База данных
Вот SQL-команды для создания трех обязательных таблиц.
Сообщение
create table Post(
headline varchar(100),
date datetime,
content text,
author int unsigned,
public tinyint,
type int,
ID serial,
Primary Key (ID),
)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
author
- это идентификатор пользователя, создавшего публикацию, public
определяет, можно ли прочитать сообщение от всех или является черновиком, а type
определяет, является ли это запись в блоге (0
) или что-то еще.
Категория
create table Kategorie(
name varchar(30),
short varchar(200),
ID serial,
Primary Key (name)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Post_Kategorie
create table Post_Kategorie(
post_ID bigint unsigned,
kategorie_ID bigint unsigned,
Primary Key (post_ID, kategorie_ID),
Foreign Key (post_ID) references Post(ID),
Foreign Key (kategorie_ID) references Kategorie(ID)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Запрос
Это мой текущий запрос, чтобы все записи были отмечены определенной категорией, которая определяется по идентификатору категории:
SELECT Post.headline, Post.date, Post.ID,
CONCAT(
"[", GROUP_CONCAT('{"name":"',Kategorie.name,'","id":',Kategorie.ID,'}'), "]"
) as "categorys"
FROM Post
INNER JOIN Post_Kategorie
ON Post.ID = Post_Kategorie.post_ID
INNER JOIN Kategorie
ON Post_Kategorie.kategorie_ID = 2
WHERE Post.public = 1
AND Post.type = 0
GROUP BY Post.headline, Post.date
ORDER BY Post.date DESC
LIMIT 0, 20
Запрос работает для перечисления всех постов, помеченных определенной категорией, но столбец categorys
смешивается, так как у каждого перечисленного поста есть все доступные категории (все категории, перечисленные в таблице Kategorie
).
Я уверен, что проблема заключается в INNER JOIN
-условии, но я понятия не имею, где. Пожалуйста, направьте меня в правильном направлении.