将JOIN限制为一个结果

时间:2014-03-26 12:41:07

标签: mysql sql

我试图写一个让我疯狂的SQL查询...

我有一个包含列id,纬度,经度的表建立。 另一个具有列id,establish_id,date。

的表事件

我想为每个机构获得一个单一的活动,更准确地说是最接近的一个活动。现在我有:

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

但这给了我完整的订购事件清单。我需要为每个establishment_id想法只获得一个事件......

你知道是否有可能吗?

2 个答案:

答案 0 :(得分: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

它首先对事件进行正确的连接&gt; =当前日期,然后进行另一个左连接以查看是否有另一个事件具有与第一个事件之前相同的establishment_id,并在有事件时将其过滤掉。

答案 1 :(得分: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