mySQL UNION和LIMIT优先使用一个SELECT

时间:2016-01-26 16:23:39

标签: php mysql

我有两个名为 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并澄清了变量。

2 个答案:

答案 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;