我有两个名为 public 和 private 的表,其中private从 public 继承主键(id),以便private.id⊆public< / p>
我想查询两个匹配某些条件的表中的最大总记录数,但如果一个id位于两个表中,我会使用 private 中的行,因为数据不同。
我认为天真的做法是两个问题:
SELECT id, data, lat, lng, (function($lat,$lng)) AS distance
FROM private
WHERE lng BETWEEN $lng1 AND $lng2
AND lat BETWEEN $lat1 and $lat2
HAVING distance < $dist LIMIT 0, $max;
$ remaining = $ max - $ result-&gt; num_rows;
if(remaining > 0){
SELECT id, data, lat, lng, (function($lat,$lng)) AS distance
FROM public
WHERE lng BETWEEN $lng1 AND $lng2
AND lat BETWEEN $lat1 and $lat2
HAVING distance < $dist LIMIT 0, $remaining;
}
虽然这似乎是UNION
的最佳位置,但我似乎不知道如何根据documentation中第一个的结果来限制第二个选择。
编辑:删除了JOINS并澄清了变量。
答案 0 :(得分:1)
在结果集中添加一个额外的列,并在union
之后对其进行排序JOIN
第二个SELECT需要一个额外的{{1}}运算符来排除私有的重复项。
答案 1 :(得分:0)
首先将组标识符分配给每个SELECT
然后使用变量创建row_id。
最后过滤row_id。
<强> SQL Fiddle Demo 强>
SET @row_total = 10;
SELECT *
FROM
(
SELECT distance,
@row := @row + 1 as rn
FROM
(
SELECT `BadgeCode` as distance,
'private' as grp
FROM Table1
UNION ALL
SELECT `Dept`as distance,
'public' as grp
FROM Table2
LEFT JOIN Table1
ON Table2.`Dept` = Table1.`BadgeCode`
WHERE Table1.`BadgeCode` IS NULL
) X
CROSS JOIN (SELECT @row :=0) Y
ORDER BY grp
) T
WHERE rn <= @row_total;