1

これは私のSQLです:

"SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
 GROUP BY username ORDER BY username";

これは私のウェブページの出力です:

Username    Friend's Name    Meeting Date
George      Nicolas          2010
Man         Anatol           2008

今のところ、各ユーザーのデータベースから最初の行だけを選択します。

各テーブルには auto_increment、最初のテーブルの id_user と 2 番目のテーブルの id_friend があります。

各ユーザーが最後に会ったあの友達を見せてほしい。

を追加しようとしましたorder by "meet_date DESC"が、うまくいきません。

どうすれば私の願いを叶えることができますか?

4

5 に答える 5

4

標準的なトリックの 1 つは、外部自己結合を使用することです。

 SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users 
 INNER JOIN friends ON (users.id_user = friends.id_user) 
 LEFT JOIN friends f2 ON friends.meet_date > f2.meet_date
 WHERE f2.(primary key) IS NULL
 GROUP BY username
 ORDER BY username

これより大きな日付値を持つレコードが他にない日付を見つけます。これにより、相関サブクエリと余分な集計の非効率性が回避されます。または、主キーを使用する場合に必要なレコードが常に会議の日付順に追加されるという疑わしい仮定。

* 他のユーザーによって編集されました *

(主キー) を主キー列テーブルまたは単に f2 列に置き換える必要があります。

SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users 
 left JOIN friends ON (users.id_user = friends.id_user) 
 LEFT JOIN friends f2 ON friends.meet_date > f2.meet_date
 WHERE f2.id_user IS NULL
 GROUP BY username
 ORDER BY username

クエリは想定どおりに実行されます。

| USERNAME | ID_USER |   NAME | MEET_DATE |
-------------------------------------------
|        a |       1 |      c |         0 |
|        b |       2 | (null) |    (null) |
于 2012-08-06T18:52:44.560 に答える
3

簡単な方法はサブクエリです。

 SELECT 
   users.username, 
   users.id_user, 
   ( select friends.name  
     from friends 
     where (users.id_user = friends.id_user) 
     ORDER BY friends.meet_date desc
     LIMIT 1 ) as friend_name,       
   ( select friends.meet_date
     from friends 
     where (users.id_user = friends.id_user) 
     ORDER BY friends.meet_date desc
     LIMIT 1 ) as friend_meet_date
 FROM users 
 ;

* テスト *

create table users (username varchar(50), id_user int);
create table friends ( name varchar(50), id_user int, meet_date int);

insert into users values ( 'a', 1),('b',2);
insert into friends values ('c', 1, 0), ('d',1,1);

結果:

| USERNAME | ID_USER | FRIEND_NAME | FRIEND_MEET_DATE |
-------------------------------------------------------
|        a |       1 |           d |                1 |
|        b |       2 |      (null) |           (null) |

sql fiddle で試してみてください

相関サブクエリはエレガントなアプローチではなく、簡単なアプローチであることに注意してください。

于 2012-08-06T18:47:29.900 に答える
1

auto_increment フィールドはありませんか? これにより、それで並べ替えることができます。もう 1 つのオプションは、適切に並べ替えることができるように、meet_date を日付フィールドに変更することです。a をフィールドDateTimeとして保存する理由はありませんvarchar

于 2012-08-06T18:46:02.697 に答える
1

withをテーブルに持っidていると仮定すると、これでうまくいくはずです:primary keyauto_incrementusers

SELECT MAX(users.id), users.username, users.id_user, friends.name, friends.meet_date 
 FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
 GROUP BY username ORDER BY username
于 2012-08-06T18:46:16.583 に答える
0
SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
 GROUP BY username ORDER BY username
having max(friends.meet_date)=friends.meet_date
于 2012-08-06T18:50:26.660 に答える