2017-11-18 6 views
0

私は運が無ければ2日間試しています。SQL left join:テーブルBから最新のものを返し、別のフィールドでグループ化する方法

のお客様::

| id | name  | 
| 1 | andrea | 
| 2 | marco | 
| 3 | giovanni | 

アクセス:私は彼らの最終アクセス日時とすべての名前を返すようにしたい

| id | name_id | date | 
| 1 | 1  | 5000 | 
| 2 | 1  | 4000 | 
| 3 | 2  | 1500 | 
| 4 | 2  | 3000 | 
| 5 | 2  | 1000 | 
| 6 | 3  | 6000 | 
| 7 | 3  | 2000 | 

は、私は私のデータベースに以下の単純化されたテーブルを持っています。

最初に私は

SELECT * FROM customers LEFT JOIN access ON customers.id = 
access.name_id 

で単に試みたが、予想通り、私は7行の代わりに、3を得ました。だから、I understood I need to use GROUP BY statemet次のように:ランダムな行を使用してコンバインBYとして、私の知る

SELECT * FROM customers LEFT JOIN access ON customers.id = 
access.name_id GROUP BY customers.id 

、GROUP。実際、私はいくつかのテストでアクセス日の順序が整っていません。

代わりに、すべての顧客IDを対応する最新のアクセスでグループ化する必要があります。どのようにこれを行うことができますか?

私は、これはあなたが達成したい何だと思います
+0

私はあなたがここで達成したいことを正しく理解しているとは確信していませんが、LEFT JOINの仕組みを誤解しているような印象を受けています。 GROUP BYは、MAXやMINなどの集計関数がある場合に機能します。あなたは、あなたが見たいと思っている出力が何であるかをより良く説明できますか? – Stefano

+0

@decadenza。 。 。 'GROUP BY 'で' SELECT *'を使用すると、MySQLの最新バージョンでうまくいきなり壊れています。それはあなたが望むことをする正しい方法ではありません。 –

答えて

1

アクセステーブルからname_idでグループ化された最新の日付を取得し、この結果を顧客テーブル。クエリは次のとおりです。

select c.id, c.name, a.last_access_date from customers c left join 
(select id, name_id, max(access_date) last_access_date from access group by name_id) a 
on c.id=a.name_id; 

ここにはsqlfiddleのDEMOがあります。

1

SELECT c.id, c.name, max(a.date) last_access 
FROM customers c 
LEFT JOIN access a ON c.id = a.name_id 
GROUP BY c.id, c.name 

LEFT・ジョイン(c.id = a.name_id)の基準に参加する場合に関係なく、テーブルの顧客のすべてのエントリを返します。満足している。これは、いくつかのNULLエントリを取得する可能性があることを意味します。

例:

は、単に顧客テーブルに新しい行を追加し(ID:4、名前:マヌエラ)。出力は4行で、最新の行は(ID:4、last_access:null)

1

私はこのON句で相関サブクエリを使用して行うだろう:このステートメントがtrueの場合

SELECT a.*, c.* 
FROM customers c LEFT JOIN 
    access a 
    ON c.id = a.name_id AND 
     a.DATE = (SELECT MAX(a2.date) FROM access a2 WHERE a2.name_id = a.name_id); 

を:

私はグループに対応する最新のアクセス権を持つすべての顧客IDが必要!どのようにこれを行うことができますか?

は、その後、あなたは簡単に行うことができます:left joinは必要ありませんので、すべてのお客様がaccessである

  • ​​

    あなたがいるのでcustomersテーブルは必要ありません。

  • customersからの列は必要ありません。
関連する問題