4

friendslocations、 の3 つのテーブルがあります。friend_location

friend_locationは、 と の間の多対多の関係を可能にする結合テーブルfriendslocationsあるため、テーブルは次のようになります。

友達


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_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

どんな提案でも大歓迎です。

4

4 に答える 4

2

あなたはこのようなことをすることができます:

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つの場所にしかいられない場合にのみ機能します。

于 2012-07-30T02:57:11.457 に答える
2

グレッグのクエリは私には正しいように見えます。同様のものを思いつきました(以下を参照)。ただし、現在の db スキーマは、2 人の友人が同じ場所を異なる順序で訪れた場合の状況を処理しません。私にとっては、日付列は場所ではなく、friend_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
于 2012-07-30T06:30:01.543 に答える
1

以下を使用できます。

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
于 2012-07-30T03:40:58.633 に答える
1

日付が場所テーブルにあるため、データ レイアウトは少し奇妙です。したがって、次のコードは各フレンドの最新の日付を取得します。

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

場所に重複した日付がないことを前提として、これは機能します。その場合、クエリはもう少し複雑になります。この仮定を立てることができますか?

于 2012-07-30T02:48:20.193 に答える