3

私のデータベースには次の3つのテーブルがあります。これは、foursqureのようなアプリケーションに使用されます。私はこれの一番下で私が尋ねたsqlステートメントを書く問題について助けが必要です。

ありがとうございました

user_details

user_id | fname
----------------
   1    | Losh
   8    | Dush
   9    | Rosh
  10    | NELL

友達

user_idf |user_idff
----------------
   1     |   8
   8     |   9
   10    |   1

チェックイン

check_in_id |user_id | place    | date
--------------------------------------------
       1    |   8    | Hotel    | 01/01/2012
       2    |   9    | Home     | 05/01/2012
       3    |   1    | Junction | 08/01/2012
       4    |   1    | Rest     | 11/01/2012
       5    |   9    | Hotel    | 15/01/2012
       6    |   8    | Home     | 15/01/2012

私は8とユーザー8の詳細と友達であるユーザーを取得し、次のように場所をチェックインします

SELECT a.`user_id`, a.`fname` , b.*
FROM `user_details` a, `check_in` b
WHERE (b.user_id = 8 
OR b.user_id in (select user_idf from friends where user_idff = '8' union select user_idff from friends where user_idf = '8')) AND b.user_id = a.user_id

8とユーザー8の詳細と、それらのユーザーの代わりに最後のチェックを行う友人を選択するSQLを作成するにはどうすればよいですか?

説明::

私は次のような答えを求めています

user id    name     place   date
   1       LOSH     Rest  11/01/2012
   8       DUSH     HOME  15/01/2012
   9       ROSH     HOTEL 15/01/2012
4

4 に答える 4

2

によって返されるテーブルにそれを結合します:

(SELECT `user_id`, `place` FROM Check_in GROUP BY user_id ORDER BY `date` DESC)

これにより、ユーザーごとに1つのエントリが得られます。また、日付の逆順に並べ替えられているため、そのエントリは最新のものである必要があります。

しかし、それでグループ化すると、最新の日付ではなく最初の日付が表示されます

これはどう:

(SELECT user_id, place
   FROM (SELECT * FROM Check_in ORDER BY `date` DESC) tmp
   GROUP BY user_id)
于 2012-08-01T04:18:12.143 に答える
0
SELECT user_id, fname, c.place
FROM user_details u
     INNER JOIN (SELECT IF(user_idff = 8, user_idf, user_idff) AS user_id
                 FROM friends
                 WHERE (user_idff = 8 OR user_idf = 8)
                ) f
                ON u.user_id = f.user_id
     LEFT JOIN (SELECT c1.user_id, place
                FROM Check_in c1
                     LEFT JOIN  Check_in c2
                         ON c1.user_id = c2.user_id AND
                            c1.date < c2.date
                WHERE c2.date IS NULL
               ) c
               ON u.user_id = c.user_id;
于 2012-08-01T04:18:52.107 に答える
0

これは関係を壊すことはありませんが、あなたの質問に答える簡単な方法です。

編集 私はあなたの質問を読み直しました、そしてあなたがユーザー8の情報も欲しいと思います。ユーザー8を別の行にするのか、友達の行に沿った情報にするのかは明確ではありません。

select *
from
    friends as f inner join check_in as ci on ci.user_id = f.user_idff
    inner join user_details as ud on ud.user_id = f.user_idff
    inner join user_details as ud8 on ud8.user_id = f.user_idf
where
    f.user_idf = 8
    and date = (
        select max(date)
        from friends as f2 inner join check_in as ci on ci.user_id = f2.user_idff
        where f2.user_idf = f.user_idf
    )

編集2 あなたが要求するのは、どのチェックイン場所に戻るかを決めることについて少し不明確かもしれません。各友達の最新の場所を個別に知りたい場合は、このオプションを使用します。最初のクエリは、すべての友達の中から最新の場所を見つけます。明らかに、これらは同じテーマの2つのバリエーションです。

select *
from
    friends as f inner join check_in as ci on ci.user_id = f.user_idff
    inner join user_details as ud on ud.user_id = f.user_idff
    inner join user_details as ud8 on ud8.user_id = f.user_idf
where
    f.user_idf = 8
    and date = (
        select max(date)
        from check_in as ci
        where ci.user_id = f.user_idff
    )
于 2012-08-01T04:29:37.940 に答える
0

(SELECT a.user_id、a.place、b.fname、a.date、a.time、a.check_in_id FROM(SELECT * FROM check_in ORDER BY dateDESC)as a、user_details as b WHERE a.user_id = b.user_id AND (a.user_id in(select user_idf from friends where user_idff = '8' union select user_idff from friends where user_idf = '8')OR a.user_id = 8)GROUP BY a.user_id)

上記のクエリは私に必要な答えを与えました。

助けてくれてありがとう

于 2012-08-01T15:12:03.830 に答える