我有这张桌子(CheckinTable):
其中user_id是UserTable的外键。
对于我有更多签到的每个用户,我需要执行一个查询,根据创建的字段返回最新的签到。
我可以使用ORDER BY修改的DESC获取最新的签入,但是如果我必须设置另一个标准 (例如,在44.00和41.00之间的p.latitude和在9.18和9.44之间的p.longitude),我如何将这两个查询合并为一个以加载最新的签名,以尊重地理定位条款?
编辑:
为了避免误解,我需要在最新的CHECKIN上为用户执行查询,按创建的DESC排序。我认为我需要为每个用户(在表格中)提取单个最新签到,然后应用地理定位条款。我怎么能这样做?
答案 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
答案 2 :(得分:0)
只需为单个用户提取相应的记录,其中user_id
为12345
:
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
如果您尝试为多个用户提取,则需要使用子查询或over
和partition 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
子句中的条件没有为该特定用户返回任何内容,则显然不会得到任何结果。