2013-04-02 91 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子句中的條件不會爲該特定用戶返回任何內容,那麼您顯然不會得到任何結果。