Получить все сообщения от пользователей с их категориями - PullRequest
3 голосов
/ 30 июня 2011

Ситуация

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

Только запроспоказывает первый пост в базе данных, не более, сколько постов у пользователя.Кроме того, сгенерированный вывод категории является неправильным.

База данных

Вот SQL-команды для создания трех обязательных таблиц.

Post

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, 
 CONCAT(
  "[", GROUP_CONCAT('{"name":"',Kategorie.name,'","id":',Kategorie.ID,'}'), "]"
 ) as "categorys"
FROM Post, Kategorie, Post_Kategorie
WHERE Post.author = 1
AND(
  Post.public = 1
  AND Post.type = 0
)AND(
  Post_Kategorie.post_ID = Post.ID
  AND Post_Kategorie.kategorie_ID = Kategorie.ID
)

Так как один пост может иметь несколько категорий, запрос генерирует JSON, который затем декодируется в объект в PHP.Это был простой способ архивировать это, подумал.

Что мне здесь не хватает?

1 Ответ

3 голосов
/ 30 июня 2011

В конце концов, вам не хватает этого:

GROUP BY Post.headline, Post.date

Обновление

Кроме того, вы заметили, что если сообщение не имеет категорий, оно не отображается. Проблема в том, что вы выполняете JOIN через WHERE предложение. Когда вы делаете это, ваше объединение всегда будет вести себя как INNER JOIN.

Чтобы сообщения всегда были, вам нужно LEFT JOIN:

SELECT Post.headline, Post.date, 
 CONCAT(
  "[", GROUP_CONCAT('{"name":"',Kategorie.name,'","id":',Kategorie.ID,'}'), "]"
 ) as "categorys"
FROM Post 
  LEFT JOIN Post_Kategorie 
    ON Post.ID = Post_Kategorie.post_ID
  LEFT JOIN Kategorie 
    ON Post_Kategorie.kategorie_ID = Kategorie.ID
WHERE Post.author = 1
AND Post.public = 1
AND Post.type = 0
GROUP BY Post.headline, Post.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...