php - 如何在单个查询中从多对多关系数据库获取博客文章和类别?或者我应该吗?

标签 php mysql

我已经为我的博客创建了一个数据库。它包含三个表,一个用于帖子,一个用于类别,一个用于帖子和类别之间的多对多关系:

CREATE TABLE IF NOT EXISTS `posts` (
  `pid` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `post` mediumtext NOT NULL,
  ...
  PRIMARY KEY (`pid`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `categories` (
  `cid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `category` varchar(200) NOT NULL,
  ...
  PRIMARY KEY (`cid`),
  ...
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `post_to_category_relation` (
  `pid` smallint(5) unsigned NOT NULL,
  `cid` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`pid`,`cid`),
  UNIQUE KEY `secondary` (`cid`,`pid`),
  FOREIGN KEY (`pid`) REFERENCES `posts` (`pid`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (`cid`) REFERENCES `categories` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在我想使用 PHP 查询该数据库,检索一篇文章的信息,并在网络上显示该文章。

但我不确定如何做到这一点。

单个帖子的所有信息都在 posts 表中:帖子标题、帖子文本、帖子作者、发布日期和 URL slug。这样我就可以通过一个查询构建我的页面。

但是,该表不包含类别。

最初,我想将类别保存为字符串(例如“apples,oranges,bananas”)并explode(",", ...)该字符串以创建指向类别页面。这将使我能够通过一个数据库查询创建整个帖子页面。但现在...

我真的需要进行第二次查询来检索帖子的类别吗?或者有没有一种方法可以在一个查询中获取我需要的所有内容 - 也许可以为我提供一个多维数组(或一个对象),其结构类似于:

Array
(
    [pid] => 1
    [post] => "Hello, World!"
    ...
    [categories] => Array
        (
            [0] => apples
            [1] => bananas
        )
)

这通常是如何完成的?最佳实践是什么?

最佳答案

试试这个:http://sqlfiddle.com/#!2/ecad8/12

select posts.pid, group_concat(categories.category)
from posts

left outer join post_to_category_relation as ptcr
on ptcr.pid = posts.pid

left outer join  categories
on categories.cid = ptcr.cid

where posts.pid = 1

然后,在您的应用程序中,您可以将类别列explode() 转换为一个数组,并以, 作为分隔符。

关于php - 如何在单个查询中从多对多关系数据库获取博客文章和类别?或者我应该吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36534555/

相关文章:

php - 如何使用 PHP 和 MySQL 限制用户输入 10 个或更少的关键字?

php - MySQL 在一个查询中选择具有唯一行的随机行

php - 检索帖子数组值

php - 拉拉维尔 6 : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

指定 innodb 数据库类型和字符集时出现 MySQL 语法错误

php - 加快laravel查询速度[解决]

php - 警告 : mysql_select_db(): supplied argument is not a valid MySQL-Link resource

php - 如何在 codeigniter 中集成 razorpay 支付网关

php - 在PHP网页上实现 "Download as PDF"

php - 计算按要求标记的项目以及另一个表中缺失或部分存在的项目