2014-03-26 46 views
1

我想寫一個SQL查詢,讓我發瘋...限制加入一個結果

我有一個表的建立與列id,緯度,經度。 另一個表列事件,其中包含列id,establish_id,日期。

我想爲每個機構獲得一個單獨的活動,並且更準確地說是最接近的一個活動。現在我有:

SELECT et.latitude, et.longitude, ev.* 
FROM establishment et 
    JOIN event ev ON et.id = ev.establishment_id 
WHERE ev.date_event >= CURDATE() 
ORDER BY ev.date_event ASC 

但是,這給了我完全排列的事件的完整列表。我只需要爲每個企業_id認爲只有一個事件...

你有任何想法,如果有可能嗎?

+0

這是可能的。您需要用一個子查詢替換EVENT,該子查詢每個機構只返回1行WHERE該行被認爲是最接近的 – AgRizzo

+0

如果兩個ev.date_event相等,您希望哪個事件?或者這不會發生? –

+0

GROUP BY沒問題,但沒有告訴我每個機構需要3個最接近的事件,因爲每個機構需要3個第一個遇到的事件。 – lightalex

回答

4

這裏是你如何與JOIN做到這一點(也可以用一個子查詢完成,但是,一般這種方法優於子查詢方法):

SELECT et.latitude, et.longitude, ev.* 
FROM establishment et 
    JOIN event ev1 
    ON ev1.establishment_id = et.id 
    AND ev1.date_event >= CURDATE() 
    LEFT JOIN event ev2 
    ON ev2.establishment_id = et.id 
    AND ev2.date_event >= CURDATE() 
    AND ev2.date_event < ev1.date_event 
WHERE ev2.establishment_id IS NULL 

它首先沒有合適的聯合事件> =電流日期,然後執行另一個左連接,查看是否有另一個具有與第一個之前相同的establishment_id的事件,並在有的情況下將其過濾掉。

+0

之前檢查它,我認爲左連接不起作用。 – jmail

+0

@jmail,第一個連接應該是內連接。我修好了它。謝謝。 –

+0

不錯的一個:)它的工作 – lightalex

0

假設MAX(ev.date_event)爲您提供最接近的事件,這應該能夠完成這項工作。

順便說一句,你沒有提到你只需要從當前日期的事件,如果這不是一個需求,那麼WHERE子句應該被刪除。

(不執行,從而尋找出語法)

SELECT et.latitude, et.longitude, ev.establishment_id, MAX(ev.date_event) 
FROM establishment et 
    JOIN event ev ON et.id = ev.establishment_id 
WHERE ev.date_event >= CURDATE() 
GROUP BY et.latitude, et.longitude, ev.establishment_id