2013-04-02 56 views
0

我有这个表(CheckinTable):SQL查询双查询

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

其中user_id是外国UserTable的关键。

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

我可以用ORDER获取最新签入改性DESC但如果我有另设标准 (例如在p.latitude BETWEEN 44.00 AND 41.00和9.18之间和9.44 p.longitude),我怎么能结合这些两个查询到一个加载最新的签入尊重地理定位条款?

编辑:

为了避免误解,我需要执行查询只对用户的最新CHECKIN,通过创建DESC排序。我认为我需要为每个用户提取单个最新签入(在表格签入中),然后应用地理定位子句。我如何做到这一点?

回答

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

假设我理解你的问题,你试图返回每个用户和他们的最大(创建)日期。如果是这样的话,我通常会加入表上本身(虽然也有根据您的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

+0

@Andomar - 我不是100%确定OP要求什么。针对每位用户提及,根据创建的情况返回最新的签入。但是,是的,如果OP只是想要最新的记录与标准,上面的答案是正确的。我会删除,如果OP不需要它:) – sgeddes

+0

你是对的,看起来像你可以阅读这样的问题。 +1 :) – Andomar

+0

此查询可以工作,但在我的情况下还有另一个问题。我只需要在用户的最新CHECKIN上执行查询,然后通过创建的DESC进行排序。我认为我需要为每个用户提取单个最新签入(在表格签入中),然后应用地理定位子句。我如何做到这一点? – CeccoCQ

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子句中的条件不会为该特定用户返回任何内容,那么您显然不会得到任何结果。