情况
我目前正在开发Blog系统,并且一直试图获取特定用户撰写的所有帖子及其类别.
该查询仅显示数据库中的第一条帖子,而不会询问用户有多少条帖子.同样,生成的类别输出是错误的.
数据库
这是创建三个必需表的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是确定该帖子可以被所有人阅读还是只是草稿,类型则确定是博客帖子(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中的对象.想,这是将其存档的简便方法.
我在这里想念什么?
解决方法:
最后,您会丢失以下内容:
GROUP BY Post.headline, Post.date
更新资料
另外,您注意到,当帖子没有类别时,它不会出现.问题是您正在通过WHERE子句执行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
标签:select,sql,mysql,php
来源: https://codeday.me/bug/20191208/2089849.html