【问题标题】:How can I select rows from two tables that have slightly different columns? How can I offset them?如何从列略有不同的两个表中选择行?我怎样才能抵消它们?
【发布时间】:2016-10-05 00:53:37
【问题描述】:

我正在为房地产应用构建搜索功能,并尝试在每页显示 100 个过滤属性。

我的第一次加载的 SQL 如下所示:

$sql = "SELECT * FROM table WHERE bedrooms = 2 LIMIT 100";

后续加载基本相同,只是多了一个偏移量。偏移量的定义是页码减一,再乘以每页的属性。

$page = $_GET[‘page’] - 1;
$propertiesPerPage = 100;
$offset = $page * $propertiesPerPage;

$sql = "SELECT * FROM table WHERE bedrooms = 2 LIMIT 100 OFFSET ".$offset;

这很好用。现在我只想做同样的事情,但是从两个表而不是一个表中获取属性。我正在尝试这个:

$sql = "SELECT * FROM table1 WHERE bedrooms = 2";
$sql .= " UNION ALL ";
$sql .= "SELECT * FROM table2 WHERE bedrooms = 2 LIMIT ".$propertiesPerPage." OFFSET ".$offset;

但是,因为每个表都有几个不同的列,所以我收到了这个错误:

The used SELECT statements have a different number of columns

两个表都有 60 列或更多列,但大多数列是相同的。 有没有办法从满足WHERE 条件的两个表中选择行?

另外,OFFSET 如何与JOINs 一起工作?如何对从两个表中选择的结果进行“分页”?

【问题讨论】:

  • 你需要提供列名,你可以在它们不匹配的地方使用 alaisis
  • 如果列数不匹配,不能UNION,不能用SELECT *,句号。
  • 另外,如果数据类型不匹配,则不能使用 UNION
  • 你可以做 2 个查询并通过 php 处理所有的分页

标签: php mysql join inner-join offset


【解决方案1】:

您的查询需要与此类似:

$sql = "
SELECT * FROM
(
(SELECT col1, col2, col3, col4 FROM table1 WHERE bedrooms = 2)
UNION ALL
(SELECT col1, col2, col3, NULL AS col4 FROM table2 WHERE bedrooms = 2)
) AS myalias
LIMIT ".$propertiesPerPage." OFFSET ".$offset;

几件事:

  1. 在每个 SELECT 语句的相应位置列出的选定列应具有相同的数据类型。 (http://dev.mysql.com/doc/refman/5.7/en/union.html)

  2. 假设您希望它返回所有行,但存在数据类型不匹配或一个表具有完全不同的列。您仍然可以从具有数据的 table1 中检索数据,但如果 table2 没有该列,那么您将需要类似 NULL AS col4 的内容。

  3. 我们使用联合作为嵌套查询的原因是因为限制将在两个查询连接在一起后应用。

  4. 通常在进行联合时,您会非常具体地确定要获取的列。如果您只需要 30 列,则需要在用于联合的选择查询中指定所有这些列。如果有必要,您可以使用 PHP 变量来定义它以减少重复。

【讨论】:

  • 只要我为顶级 SELECT 语句设置别名,这似乎就可以工作。虽然每个表实际上有 200 多列,但我很难选择所有内容(它仍然说使用的 SELECT 语句有不同的列数)。有没有办法在不单独指定每一列的情况下做到这一点?第一个表有大约 20 列,第二个没有,第二个表有大约 20 列,第一个没有。考虑到 200 多列,我看不出差异在哪里。
  • 好的,我找到了我没有考虑的缺失列,现在选择可以工作,但是,第二个表的值在错误的列中。它们似乎被第一个表中的列数而不是第二个表中的列数所抵消。这是演示这一点的屏幕截图。 postimg.org/image/9gri1znon
  • 您需要选择的列与它们返回时的匹配顺序相同。 Share_perc 必须位于每个子查询中的相同位置。所选列的顺序很重要,因此它们在合并时会“对齐”
  • 啊,好的。那讲得通。看到我有 260 多列要排序,我开始认为将这些表合并到一个表中实际上可能是一种更好的方法。它只会使分页更易于管理。话虽如此,我认为你是对的,所以我将你的回复设置为答案。
  • 您会显示 260 列中的所有数据吗?您可以排除不需要的列,使其更易于管理
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 2015-08-07
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多