我目前正在开发一个博客系统,而且我一直试图获取特定用户制作的所有类别的帖子。
“查询”仅显示数据库中的第一篇帖子,而不显示用户拥有的帖子数量。此外,生成的类别输出是错误的。
以下是用于创建三个必需表的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;
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中的对象。想到这就是存档的简便方法。
我在这里缺少什么?
答案 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