MySQL 查询以按特定类别列出 multi-category 篇文章,同时仍检索主猫
MySQL Query to list multi-category articles by a specific category, while still retrieving primary cat
我有一个文章系统,其中的文章可以位于不同的部分,例如食谱、操作方法、社论、新闻等。
这些文章中的每一篇也可以属于一个或多个类别。例如,食谱可以属于松饼类别和蓝莓类别。
然后当我生成 url 时,它的格式为:
example.com/{post_section}/{primary_post_category_slug}/{post_title}/
在列出文章时,我会在标题上方显示文章所属的每个类别。这些类别中的每一个都是 link,单击时仅显示属于该类别的文章。
我的问题是,当列出一个类别中的所有文章时,如果一篇文章有多个类别,我不知道如何检索第一个类别。例如,如果我有一篇关于蓝莓松饼食谱的文章,我会把它放在松饼的主要类别和蓝莓的次要类别中。
现在,如果访问者浏览蓝莓类别,它应该列出与蓝莓相关的所有文章,但 link 仍应包含主要类别别名是什么。我的问题是检索与我们列出的类别不同的主要类别。
下面是我正在使用的示例查询和 table 结构:
select p.*, c.*, t.* from posts p
left join post_category_selected a on a.post_id = p.post_id
left join post_category c using (post_category_id)
left join post_section t using (post_section_id)
and c.post_category_slug = "blueberry"
and t.post_section_slug = "recipes"
order by p.post_publish_date desc
这 return 所有有蓝莓类别的文章,但我不知道如何检索 primary_category 松饼,所以我可以在生成我的 [=38] 时使用它=].
希望这是有道理的。
Table结构:
posts
|- post_id
|- post_title
|- post_section
|- post_slug
|- post_publish_date
post_category
|- post_category_id
|- post_section_id
|- post_category
|- post_category_slug
post_category_selected
|- post_category_selected_id
|- post_id
|- post_category_id
|- is_primary (enum Y,N)
post_section
|- post_section_id
|- post_section_title
|- post_section_slug
您需要加入 post_category 和 post_category_selected 各两次,一次用于所选类别,一次用于主要类别。像这样:
select p.*, c1.*, t.*,
c2.post_category_slug as primary_category_slug
from posts p
left join post_category_selected a1 on a1.post_id = p.post_id
left join post_category c1 using (post_category_id)
left join post_section t using (post_section_id)
and c.post_category_slug = "blueberry"
and t.post_section_slug = "recipes"
left join post_category_selected a2 on a2.post_id = p.post_id
and a2.is_primary = 'Y'
left join post_category c2 on c2.post_category_id = a2.post_category_id
order by p.post_publish_date desc
您可能需要从 c2 添加一些额外的列,具体取决于您的其他要求。
我有一个文章系统,其中的文章可以位于不同的部分,例如食谱、操作方法、社论、新闻等。
这些文章中的每一篇也可以属于一个或多个类别。例如,食谱可以属于松饼类别和蓝莓类别。
然后当我生成 url 时,它的格式为:
example.com/{post_section}/{primary_post_category_slug}/{post_title}/
在列出文章时,我会在标题上方显示文章所属的每个类别。这些类别中的每一个都是 link,单击时仅显示属于该类别的文章。
我的问题是,当列出一个类别中的所有文章时,如果一篇文章有多个类别,我不知道如何检索第一个类别。例如,如果我有一篇关于蓝莓松饼食谱的文章,我会把它放在松饼的主要类别和蓝莓的次要类别中。
现在,如果访问者浏览蓝莓类别,它应该列出与蓝莓相关的所有文章,但 link 仍应包含主要类别别名是什么。我的问题是检索与我们列出的类别不同的主要类别。
下面是我正在使用的示例查询和 table 结构:
select p.*, c.*, t.* from posts p
left join post_category_selected a on a.post_id = p.post_id
left join post_category c using (post_category_id)
left join post_section t using (post_section_id)
and c.post_category_slug = "blueberry"
and t.post_section_slug = "recipes"
order by p.post_publish_date desc
这 return 所有有蓝莓类别的文章,但我不知道如何检索 primary_category 松饼,所以我可以在生成我的 [=38] 时使用它=].
希望这是有道理的。
Table结构:
posts
|- post_id
|- post_title
|- post_section
|- post_slug
|- post_publish_date
post_category
|- post_category_id
|- post_section_id
|- post_category
|- post_category_slug
post_category_selected
|- post_category_selected_id
|- post_id
|- post_category_id
|- is_primary (enum Y,N)
post_section
|- post_section_id
|- post_section_title
|- post_section_slug
您需要加入 post_category 和 post_category_selected 各两次,一次用于所选类别,一次用于主要类别。像这样:
select p.*, c1.*, t.*,
c2.post_category_slug as primary_category_slug
from posts p
left join post_category_selected a1 on a1.post_id = p.post_id
left join post_category c1 using (post_category_id)
left join post_section t using (post_section_id)
and c.post_category_slug = "blueberry"
and t.post_section_slug = "recipes"
left join post_category_selected a2 on a2.post_id = p.post_id
and a2.is_primary = 'Y'
left join post_category c2 on c2.post_category_id = a2.post_category_id
order by p.post_publish_date desc
您可能需要从 c2 添加一些额外的列,具体取决于您的其他要求。