【问题标题】:Related posts: Get records by tags from different tables相关文章:通过标签从不同的表中获取记录
【发布时间】:2009-10-21 14:47:59
【问题描述】:

我正在开发一个新闻网站。像每个新闻网站一样,会有新闻、专栏、视频和照片库。我打算将这些不同类型的记录保存在不同的表中,但将它们与标签相关联。这是一个简单的架构:

表格:新闻、视频、画廊、专栏、标签、Post_to_tags

Post_to_tags:
- 标记ID
- postid
- posttype [新闻、视频、图库、栏目]

现在我需要做的是在单个查询中获取帖子的相关记录。加入一张桌子并获得相关帖子很容易,但是当涉及到不同的桌子时......有什么想法吗?

【问题讨论】:

  • 你能提供更多细节吗?不清楚你在问什么。
  • 您能解释一下您要准确选择什么吗?
  • 我需要从不同的表中获取每条相关记录。正如我所说,加入一个表很容易,但我必须根据 posttype 加入不同的表。

标签: php mysql schema


【解决方案1】:

您可能希望在两个查询中执行此操作,因为在一个查询中执行此操作会非常难看,并且在速度方面可能不会给您带来太多好处。

因此,您将使用标签来获取所有相关的 postid,然后只需执行连接以获取与 postid 相关的文章和关联记录。

select n.*, g.*, v.* FROM News n 
   INNER JOIN Galleries g ON(g.postid=n.postid) 
   INNER JOIN Videos v ON(v.postid=n.postid) 
   WHERE n.postid IN(
     (SELECT p.postid FROM Post_to_tags p WHERE ...)
   )

这应该是一个起点,但我看到了你的问题,因为你有 posttype。

为什么不忽略这个查询的 posttype,只为故事使用相同的 postid,这样他们就有了一种容易被搜索到的方法。

【讨论】:

    【解决方案2】:

    如果您的查询获得相同数量的具有相同数据类型的字段,则可以使用 UNION。

    SELECT fielda, fieldb FROM news n 
      JOIN post_to_tags p ON (n.post_id=p.post_id) 
      where p.tag_id='x' and p.post_type='news'
    UNION
    SELECT fielda, fieldb FROM videos v 
      JOIN post_to_tags p ON (v.post_id=p.post_id) 
      where p.tag_id='x' and p.post_type='videos'
    

    但如果是这种情况,您可能需要重新考虑您的架构。比如:

    • 发布表,其中包含所有公共字段 帖子类型和帖子的标志字段 输入
    • Details_X 具有特定字段的表 输入 X 个帖子

    将允许单个查询:

    SELECT fielda, fieldb FROM posts p 
      JOIN post_to_tags pt ON (p.post_id=pt.post_id) 
      where pt.tag_id='x';
    

    【讨论】:

    • 感谢有关表架构的建议。我也在想。我也在考虑将 post_link 和 post_title 存储在 post_to_tags 表中。所以我不需要使用join。但每一种方式都有它自己的问题。性能将非常重要。所以我正在寻找“最便宜”的解决方案。
    猜你喜欢
    • 2021-06-09
    • 2014-01-07
    • 2014-01-20
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多