【问题标题】:Fetching results from different tables with the same structure从具有相同结构的不同表中获取结果
【发布时间】:2011-07-02 21:29:41
【问题描述】:

有人问我是否可以从合并到一个名称冲突的数据库中的 18 个不同的 Wordpress 数据库中获取结果,过滤它们,然后在 PHP 中使用结果。

例如:

我在 ara_posts、val_posts 和 car_posts 中有数据(帖子)(它们都是列名中包含 post_name、post_type、post_status 和 post_date 的表)。我想从这些表中选择所有数据并过滤结果(仅显示具有 post_type = 'post' 的结果)。

我想要对结果做的是比较日期并从所有这 18 个表中获取最新的 3 个帖子,这些表的状态为“发布”,帖子类型为“帖子”。

这怎么可能?

【问题讨论】:

  • 每个表中的最新 3 个(所以 3x18 行)还是所有表中的最新 3 个?
  • @ypercube 所有表格中最新的 3 个(根据 GMT) - 它会获取帖子,然后比较哪个表格具有最新的 GMT 发布日期,无论是哪个表格。

标签: php mysql sql wordpress


【解决方案1】:

正如this question quite similar to yours 的回答中所建议的,您可能可以使用UNION 运算符。像这样的:

(SELECT post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(SELECT post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3

【讨论】:

  • 这似乎可行,但在代码方面它完全是低效的,因为如果我必须为我需要做的每个查询复制/粘贴 18 个确切的查询,对吗? - 如果我想更改其中一个查询中的“where”子句,我必须手动为所有这些查询。对我来说似乎不是最佳选择。
  • @ypercube 完全同意。我想我可能使用了错误的表达方式——对我来说似乎不是“可维护”的代码。你没有什么建议吗?
  • @AeroCross:您可以使用 PHP 代码生成 SQL 查询,将相同的部分(条件、顺序、限制)添加到 18 个子查询中。
【解决方案2】:

您可能只是在选择中添加一个手动列,以便您知道数据来自哪个数据库:

(SELECT 'ara' as dbname, post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(SELECT 'val' as dbname, post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL (...) ORDER BY post_date DESC LIMIT 3 

【讨论】:

    【解决方案3】:

    我会根据其他答案(但没有位置和限制)部分中的联合查询来定义一个视图。然后就可以直接查询视图了。视图类似于函数 - 它是数据库重用的基本单元。

    【讨论】:

    • 这绝对是一个很好的建议。我会告诉你一切顺利。
    【解决方案4】:

    我会在所有子查询中添加ORDER BY post_date DESC LIMIT 3 部分。这样,所有子查询都将使用对应表的post_date 字段的索引,而主查询只需对 18x3 行进行排序。

    如果您只有在主查询中,它将必须获取所有(数千?数百万?)行然后排序。我不确定优化器是否足够聪明,不会这样做:

    ( SELECT post_name, post_type, post_status, post_date, 'ara' AS source 
      FROM ara_posts 
      WHERE post_status='publish' 
        AND post_type='post'
      ORDER BY post_date DESC
      LIMIT 3
    )
    UNION ALL
    ( SELECT post_name, post_type, post_status, post_date, 'val' AS source 
      FROM val_posts
      WHERE post_status='publish' 
        AND post_type='post'
      ORDER BY post_date DESC
      LIMIT 3
    )
    UNION ALL
    (...)
    ORDER BY post_date DESC
    LIMIT 3
    

    而且丹尼斯对如何确定最终结果的来源有一个非常好的观点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2013-07-15
      • 2019-06-16
      相关资源
      最近更新 更多