获取用户及其类别的所有帖子

时间:2011-06-30 19:21:02

标签: php mysql sql select

情况

我目前正在开发一个博客系统,而且我一直试图获取特定用户制作的所有类别的帖子。

“查询”仅显示数据库中的第一篇帖子,而不显示用户拥有的帖子数量。此外,生成的类别输出是错误的。

数据库

以下是用于创建三个必需表的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是创建帖子的用户的ID,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 个答案:

答案 0 :(得分:3)

你最后错过了这个:

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