如何从两个列略有不同的表中选择行?我该如何抵消它们?

时间:2016-10-05 00:53:38

标签: php mysql join inner-join offset

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

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

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

后续加载与附加偏移基本相同。偏移量由页码减去1乘以每页属性定义。

$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如何与JOIN一起使用?我怎样才能分页"结果是从两个表中选出的?

1 个答案:

答案 0 :(得分:0)

您的查询需要与此类似:

$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. 我们将union用作嵌套查询的原因是因为在两个查询连接在一起后将应用限制。

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