我试图写一个让我疯狂的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想法只获得一个事件......
你知道是否有可能吗?
答案 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