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