【问题标题】:PDO select from multiple identical tablesPDO 从多个相同的表中选择
【发布时间】:2012-08-04 19:41:17
【问题描述】:

我想从多个相同的表(三个甚至更多)中获取数据,它们的列名相同(但行中的数据不同)。

所以,我想用循环获取所有表,就好像它是一个查询(一个循环),而不是三个。

我不想在获取数组时将列数增加三倍。我希望所有表都使用相同的列名。表格中的数据将在数组中一个叠放在另一个上,而不是一个挨着另一个,使数组中的列数增加三倍。但是,一旦它们堆叠在一起,“ORDER BY”过滤器将“混合”这些表:“ORDER BY”将同时作用于所有表(就像它只是一个表一样),而不是全部单独的表。

我对 1 个表的查询如下所示:

$pdo = "SELECT * FROM " .$table1 ." ORDER BY price LIMIT " 
       .$current_page_offset .", " .$items_per_pages;

所以...我想获取三个表,就像我只获取一个表一样。

*还想保持我的限制和“ORDER BY”甚至更多的过滤器工作。我不希望在我的页面上显示三倍于我想要的项目数量的三倍限制......

有没有办法做到这一点?

*编辑:我在第 3 段更改了对“混合”的描述。对不起(也许)我的英语不好。

【问题讨论】:

  • “混合”?你需要更具体。提供示例数据。
  • 按照我的理解,他想将一个表的结果集附加到前一个相同表的结果集。

标签: php mysql pdo


【解决方案1】:

你想使用UNION:

UNION 用于将多个SELECT 语句的结果组合成一个结果集。

因此,如果您的表名位于名为$tables 的数组中:

mb_regex_encoding($charset); // character set of database connection
foreach ($tables as $table) {
  $table = '`'.mb_ereg_replace('`','``',$table).'`';
  $sql[] = "(
    SELECT   *
    FROM     $table
    ORDER BY price
    LIMIT    $current_page_offset, $items_per_pages
  )";
}
$sql = implode(' UNION ALL ', $sql);

但是听起来好像您的架构应该被规范化,这样您就没有这样的“相同”表:而是有一个带有附加列的单个表来指示每个表的区别。

【讨论】:

  • 我应该把 ORDER BY 放在最后吗?如果我像你那样说的话,听起来它会在联合之前单独订购每个表......?
  • @Che:这取决于您要达到的目标。如果LIMIT 必须接管每个单独的表,那么大概每个选择的顺序很重要?在这种情况下,ORDER BY 子句必须放在我放置它们的位置(尽管如果还必须对聚合结果进行排序,也可以在最终的$sql 末尾添加一个ORDER BY)。但是,我要再次强调,您几乎肯定应该更改您的架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多