[英]SQL Query between 3-tables of a many-to-many relationship
我有三個表: friends
, locations
, friend_location
friend_location
是一個friend_location
表,用於允許friends
和locations
之間進行多對多關系,因此這些表將如下所示:
友人
ID | Name
1 | Jerry
2 | Nelson
3 | Paul
地點
ID | Date | Lat | Lon
1 | 2012-03-01 | 34.3 | 67.3
2 | 2011-04-03 | 45.3 | 49.3
3 | 2012-05-03 | 32.2 | 107.2
friend_location
Friend_ID | Location_id
1 | 2
2 | 1
3 | 3
2 | 2
我想做的就是獲取每個朋友的最新位置。
結果
ID | Friend | Last Know Location | last know date
1 | Jerry | 45.3 , 49.3 | 2011-04-03
2 | Nelson | 34.3 , 67.3 | 2012-03-01
3 | Paul | 32.2 , 107.2 | 2012-05-03
這是我在查看各種示例之后嘗試過的方法,但是它返回了許多結果,並且是不正確的:
select f.id , f.name , last_known_date
from friends f, (
select distinct fl.friend_id as friend_id, fl.location_id as location_id, m.date as last_known_date
from friend_location fl
inner join (
select location.id as id, max(date) as date
from location
group by location.id
) m
on fl.location_id=m.id
) as y
where f.id=y.friend_id
任何建議將不勝感激。
您可以執行以下操作:
SELECT f.id, f.name, last_known_date, l.Lat, L.Lon
from Friends f
join
(
select f.id, MAX(l.Date) as last_known_date
from Friends f
JOIN Friend_Location fl on f.ID = fl.Friend_ID
JOIN Location l on l.ID = fl.Location_ID
GROUP BY f.id
) FLMax
on FLMax.id = f.id
join Friend_Location fl on fl.friend_ID = f.ID
join Location l on fl.location_ID = l.ID AND l.Date = FLMax.Last_Known_Date
基本上,您的問題是您要按location.id分組,因為ID是唯一的,所以它將為您提供所有位置。
僅當朋友在任何一次只能位於1個位置時,此方法才有效。
Gregs查詢對我來說看起來是正確的,我想出了類似的一個(見下文)。 但是,當兩個朋友以不同順序訪問相同位置時,當前的數據庫架構無法處理這種情況。 對我來說,日期列似乎應該在friend_location表中,而不是location中。 但是,如果不是,則查詢為:
SELECT F.ID, F.Name AS Friend, L.Lat, L.Lon, L.Date
FROM
(
SELECT MAX(L.date) AS max_date, F.ID
FROM Friends F
JOIN friend_location FL ON F.ID=FL.Friend_ID
JOIN Location L ON L.ID=FL.Location_id
GROUP BY F.ID
) AS X
JOIN Friends F ON X.ID=F.ID
JOIN friend_location FL ON F.ID=FL.Friend_ID
JOIN location L ON L.ID=FL.Location_id AND L.Date=X.max_date
您的數據布局有點奇怪,因為日期在位置表中。 因此,以下將檢索每個朋友的最新日期:
select fl.friend_id, max(l.date) as maxdate
from friend_location fl
location l join
on fl.location_id = l.location_id
現在,讓我們將信息加入此查詢中:
select f.*, maxdate, l.*
from (select fl.friend_id, max(l.date) as maxdate
from friend_location fl
JOIN location l
on fl.location_id = l.id
group by fl.friend_id
) flmax join
friends f
on flmax.friend_id = f.id
join location l
on l.date = flmax.maxdate
假設這些地點沒有重復的日期,這將起作用。 如果這樣做的話,查詢會更加復雜。 我們可以做這個假設嗎?
您可以使用:
SELECT
a.*,
CONCAT(d.Lat, ' , ', d.Lon) AS last_known_location,
d.Date AS last_known_date
FROM
friends a
JOIN
(
SELECT a.Friend_ID, MAX(b.Date) AS maxdate
FROM friend_location a
JOIN location b ON a.Location_id = b.ID
GROUP BY a.Friend_ID
) b ON a.ID = b.Friend_ID
JOIN
friend_location c ON b.Friend_ID = c.Friend_ID
JOIN
location d ON c.Location_id = d.ID AND b.maxdate = d.Date
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.