【问题标题】:PHP MySQL custom blog, listing categoriesPHP MySQL 自定义博客,列出分类
【发布时间】:2010-11-08 15:16:00
【问题描述】:

我正在用 PHP 设计一个自定义博客。在我的面板上,我有标题“类别”,我列出了类别以及每个类别中有多少帖子。有 2 个相关表,posts 和 post_categories。

POSTS - post_id、post_title、post、 category_id

POST_CATEGORIES - category_id, category_name, post_id

我不希望添加未分类的类别,因为这会给我计划设计的未来功能带来问题。我的 SQL 是:

SELECT *, COUNT(*) AS category_post_count
FROM post_categories, posts
WHERE posts.category_id = post_categories.category_id
GROUP BY category_name

现在,如果一个帖子没有设置 category_id,它的 category_id 为 0,并且不会与 post_categories 中的任何内容相关。如何在我的 SQL 语句中将它们分组为未分类?

谢谢。

【问题讨论】:

  • POST_CATEGORIES 表中的“post_id”需要什么?这是否意味着对于每个 POST,您将拥有新的 category_id ?这没有意义。帖子的类别应该是 1:n 。你有 1:1 这可能不是博客应用程序的最佳方式。
  • 不确定如何让您的查询完全适合您,但我可以提供一些其他信息。我知道您不想为未分类的内容创建一行,但为什么呢?是因为您不希望它出现在您网站的其他区域吗?如果是这种情况,那么将您的 SQl 更改为不返回 category_id 为 0 的结果。如果绝对没有未分类的行,那么您可以执行两个查询,一个返回您的帖子,一个返回您的类别表,然后使用 PHP进行数学计算,如果其中一个帖子的类别 id 为 0,则将其设为未分类类别。

标签: php mysql


【解决方案1】:

您可以进行左连接以包含任何没有类别的帖子。

SELECT *, COUNT(*) as category_post_count
FROM post_categories LEFT JOIN posts
  ON posts.category_id = post_categories.category_id
GROUP BY category_name;

【讨论】:

  • 太好了,谢谢。如果它们没有 category_name,我将如何从结果中调用它们?
  • post_categories 中的字段 category_id、category_name 和 post_id 对于没有类别的帖子都将为 NULL,因此在 PHP 中您可以简单地检查是否为 $row['category_name'] === NULL
  • 感谢您迄今为止的帮助。我刚刚对 SQL 进行了测试,它似乎没有返回任何 null,即使在 PhpMyAdmin 中执行也是如此?
  • 似乎适用于 RIGHT JOIN,而不是 LEFT JOIN。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多