SQL Query双查询

时间:2013-04-02 17:47:24

标签: sql geolocation where

我有这张桌子(CheckinTable):

  • ID
  • 创建
  • 纬度
  • 经度
  • USER_ID

其中user_id是UserTable的外键。

对于我有更多签到的每个用户,我需要执行一个查询,根据创建的字段返回最新的签到。

我可以使用ORDER BY修改的DESC获取最新的签入,但是如果我必须设置另一个标准 (例如,在44.00和41.00之间的p.latitude和在9.18和9.44之间的p.longitude),我如何将这两个查询合并为一个以加载最新的签名,以尊重地理定位条款?

编辑:

为了避免误解,我需要在最新的CHECKIN上为用户执行查询,按创建的DESC排序。我认为我需要为每个用户(在表格中)提取单个最新签到,然后应用地理定位条款。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

WHERE子句和ORDER BY子句是完全独立的,可以根据需要混合和匹配。 ORDER BY必须始终位于WHERE之后。

SELECT * 
FROM CheckinTable as p 
WHERE p.latitude BETWEEN 44.00 AND 41.00 AND p.longitude BETWEEN 9.18 AND 9.44 
ORDER BY modified DESC

答案 1 :(得分:1)

假设我理解了您的问题,那么您将尝试返回每个用户及其最大(创建)日期。如果是这种情况,我通常会自己加入表格(尽管根据您的RDBMS还有其他选项):

select distinct t.*
from yourtable t
  join (
      select max(created) maxcreated, user_id
      from yourtable
      group by user_id
    ) t2 on t.user_id = t2.user_id and t.created = t2.maxcreated

如果您有WHERE条件,请将其放在子查询中:

select distinct t.*
from yourtable t
  join (
      select max(created) maxcreated, user_id
      from yourtable
      where latitude between 44.00 and 41.00
      group by user_id
    ) t2 on t.user_id = t2.user_id and t.created = t2.maxcreated

SQL Fiddle Demo

答案 2 :(得分:0)

只需为单个用户提取相应的记录,其中user_id12345

SELECT TOP 1 CheckinTable.*
FROM         CheckinTable
WHERE        CheckinTable.user_id = 12345
AND          CheckinTable.latitude >= 44.00
AND          CheckinTable.latitude <= 41.00
AND          CheckinTable.longitude >= 9.18
AND          CheckinTable.longitude <= 9.44
ORDER BY     CheckinTable.modified DESC

如果您尝试为多个用户提取,则需要使用子查询或overpartition by语句(partition by比分组更有效,但使用有点古怪):

SELECT p.id ,
       p.created ,
       p.latitude ,
       p.longitude ,
       p.user_id
FROM   (
    SELECT CheckinTable.id ,
    CheckinTable.created ,
    CheckinTable.latitude ,
    CheckinTable.longitude ,
    CheckinTable.user_id ,
    ROW_NUMBER() OVER (PARTITION BY
        CheckinTable.user_id) AS the_row_number
    FROM         CheckinTable
    WHERE        CheckinTable.latitude >= 44.00
    AND          CheckinTable.latitude <= 41.00
    AND          CheckinTable.longitude >= 9.18
    AND          CheckinTable.longitude <= 9.44
    ORDER BY     CheckinTable.modified DESC ) p
WHERE    the_row_number = 1

请注意,我更喜欢使用>=<=及类似语句,而不是between,因为有时您希望对返回的内容进行更多控制而不是between (包容性,排他性等)。另请注意,如果where子句中的条件没有为该特定用户返回任何内容,则显然不会得到任何结果。