我正在为房地产应用构建搜索功能,而我正在尝试每页显示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
一起使用?我怎样才能分页"结果是从两个表中选出的?
答案 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;
一些事情:
每个SELECT语句的相应位置中列出的选定列应具有相同的数据类型。 (http://dev.mysql.com/doc/refman/5.7/en/union.html)
假设您希望它返回所有行,但存在数据类型不匹配或一个表具有完全不同的列。您仍然可以从table1中检索包含数据的数据,但如果table2没有该列,那么您需要NULL AS col4
之类的内容。
我们将union用作嵌套查询的原因是因为在两个查询连接在一起后将应用限制。
通常在进行工会时,您将非常具体地了解您将获取哪些列。如果只需要30列,则需要在用于联合的选择查询中指定所有这些列。如果看起来有必要,可以使用PHP变量来定义它以减少重复。