【问题标题】:Get all posts from a user with their category's获取用户的所有帖子及其类别
【发布时间】:2011-09-26 06:24:40
【问题描述】:

情况

我目前正在开发一个博客系统,并且我一直在尝试获取由特定用户发布的所有类别的帖子。

查询只显示数据库中的第一个帖子,不管用户有多少帖子。此外,生成的类别输出是错误的。

数据库

这里是创建三个必需表的 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 中的对象。这是存档的简单方法,我想。

我在这里错过了什么?

【问题讨论】:

    标签: php mysql sql select


    【解决方案1】:

    你最后错过了这个:

    GROUP BY Post.headline, Post.date
    

    更新

    另外,您注意到当帖子没有类别时,它不会出现。问题是您正在通过WHERE 子句执行JOIN。当您这样做时,您的联接将始终表现为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
    

    【讨论】:

    • 好的,这行得通。但另一件事:当帖子没有类别时,它不在列出的帖子中。我将如何解决这个问题?
    • 嗯,那将是另一个问题。但我会更新我的答案以适应这个问题
    • 在我的课程中,我们还没有涉及到这一点。我去看看,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多