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 添加一些额外的列,具体取决于您的其他要求。