0

我有这张表(CheckinTable):

  • ID
  • 创建
  • 纬度
  • 经度
  • 用户身份

user_idUserTable 的外键在哪里。

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

ORDER BY我可以通过修改来获取最新的签入,DESC但如果我必须设置另一个条件(例如WHERE p.latitude BETWEEN 44.00 AND 41.00 AND p.longitude BETWEEN 9.18 AND 9.44),我如何将这两个查询合并为一个以加载尊重地理定位子句的最新签入?

编辑

为避免误解,我只需要在用户的最新检查中执行查询,按创建的 DESC 排序。我认为我需要为每个用户提取单个最新签入(在签入表中),然后应用地理定位子句。我该怎么做?

4

3 回答 3

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
于 2013-04-02T17:54:01.830 回答
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 小提琴演示

于 2013-04-02T17:54:46.613 回答
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

如果您尝试为多个用户提取它,则需要使用子查询或overandpartition 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

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

于 2013-04-02T18:08:12.210 回答