【发布时间】:2021-08-04 17:17:16
【问题描述】:
我正在为我的网站实现一个标签系统,使用 PHP + MySQL。
在我的数据库中,我有三个表:
帖子
| Id | Title | DateTime |
|---|
主键:ID
标签
| Id | Tag | Slug |
|---|---|---|
| 1 | First Tag | first-tag |
主键:ID |关键:蛞蝓
标签地图
| Id | Tag |
|---|
主键:两者
(Id = 帖子中的帖子 ID;标签 = 标签中标签的 ID)
例如,给定网址 www。 ... .net/tag/first-tag,我需要显示:
- 标签的名称(在本例中:“第一个标签”);
- 最近发布的 30 个具有该标签的帖子。
为了实现这一点,我使用了两个不同的查询:
首先
SELECT Tag FROM Tags WHERE Slug = ? LIMIT 1
然后
SELECT p.Title FROM Posts p, Tags t, TagsMap tm
WHERE p.Id = tm.Id
AND p.DateTime <= NOW()
AND t.Id = tm.Tag
AND t.Slug = ?
ORDER BY p.Id DESC
LIMIT 30
但我认为这在性能方面不是一个好的解决方案(如果我错了,请纠正我)。
所以,我的问题是:如何(如果可能)将这两个查询合并为一个?
提前感谢您的建议。
【问题讨论】:
-
您不应使用基于逗号的连接。使用
join并定义与ons 的关系。你已经有t.Slug = ?那么你为什么需要第一个查询呢?使用更大数据集的 SQL fiddle 可能会有所帮助。 -
@user3783243 我需要第一个查询来获取标签名称,以便将其显示为页面标题。但我是第一个说这不是一个好的解决方案。
-
为什么您的每个表都没有唯一的主键?
-
@Martin 我已经编辑了我的问题(见表格)。
-
t.name应该有它的标签。在你的第二个选择中包含它,第一个不需要
标签: mysql