我怎样才能 select 来自列略有不同的两个表的行?我怎样才能抵消它们?

How can I select rows from two tables that have slightly different columns? How can I offset them?

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

我的 SQL 第一次加载看起来像这样:

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

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

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

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

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

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

但是,因为每个 table 都有一些不同的列,所以我得到这个错误:

The used SELECT statements have a different number of columns

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

此外,OFFSET 如何与 JOIN 一起使用?我如何 "paginate" 从两个 table 中 select 编辑结果?

您的查询需要与此类似:

$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. 假设您希望它 return 所有行,但存在数据类型不匹配或一个 table 具有完全不同的列。您仍然可以从 table1 中检索具有数据的数据,但如果 table2 没有该列,那么您将需要类似 NULL AS col4.

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

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