2017-08-17 20 views
1

2つのテーブルがあります。SQL JOINと2番目のテーブルの条件付きリミット結果

ポートフォリオ:

+----+-------+--------------+ 
| id | name | created_date | 
+----+-------+--------------+ 
| 1 | Port 1| 2017/08/12 | 
+----+-------+--------------+ 
| 2 | Port 2| 2017/08/14 | 
+----+-------+--------------+ 
| 3 | Port 3| 2017/08/15 | 
+----+-------+--------------+ 

写真:

結果:

を私は以下のような結果を取得するために照会することができますどのように

+----+------------+--------------+--------------+-----------------+ 
| id | Port_name | port_id    | user_id    | created_at  | 
+----+------------+--------------+--------------+-----------------+ 
| 1 | Port 1  |   1 |  null | 2017/08/10 | 
+----+------------+--------------+--------------+-----------------+ 
| 2 | Port 2  |   2 |  null | 2017/08/11 | 
+----+------------+--------------+--------------+-----------------+ 
| 3 | Port 3  |   3 |  null | 2017/08/12 | 
+----+------------+--------------+--------------+-----------------+ 
| 4 | Port 1  |   1 |   1 | 2017/08/13 | 
+----+------------+--------------+--------------+-----------------+ 
| 5 | Port 2  |   2 |   1 | 2017/08/14 | 
+----+------------+--------------+--------------+-----------------+ 
| 6 | Port 3  |   3 |   1 | 2017/08/15 | 
+----+------------+--------------+--------------+-----------------+ 
| 7 | Port 2  |   2 |   1 | 2017/08/16 | 
+----+------------+--------------+--------------+-----------------+ 
| 8 | Port 3  |   3 |   1 | 2017/08/17 | 
+----+------------+--------------+--------------+-----------------+ 
| 9 | Port 2  |   2 |   1 | 2017/08/18 | 
+----+------------+--------------+--------------+-----------------+ 
|10 | Port 3  |   3 |   1 | 2017/08/19 | 
+----+------------+--------------+--------------+-----------------+ 

NOT NULL

  • のcreated_atがある

    1. のuser_idがある:私は何をしたいか
      +---------+------------+----------------+-----------------+ 
      | Port_id | port_name | photo_id  | photo_created_at| 
      +---------+------------+----------------+-----------------+ 
      | 2  | Port 2  |  7  | 2017/08/16 | 
      +---------+------------+----------------+-----------------+ 
      | 3  | Port 3  |  8  | 2017/08/17 | 
      +---------+------------+----------------+-----------------+ 
      

      ポートフォリオ写真テーブルとテーブル、そして写真いくつかの条件とテーブルの限界結果を結合です"second secondest"。 2017/08/112017/08/122017/08/162017/08/19

    は "二番目に古い" の意味は、例えば、私は4つの日付時刻を持っています。

    この場合、「2番目に古い」は2017/08/12です。私は自分で試してみました

    このため
    SELECT p.id as Port_id, 
         p.name as Port_name, 
         ph.id as photo_id, 
         ph.created_at as photo_created_at 
    FROM "Portfolios" AS p 
    LEFT JOIN (
          SELECT * 
          FROM "Photos" 
          WHERE user_id IS NOT NULL 
          ORDER BY created_at ASC 
          LIMIT 1 OFFSET 1) as ph 
    ON p.id = ph.port_id; 
    

    とグーグルが、私の問題を解決するためには何も見つかりません。

    助けが必要ですか? 進歩に感謝!

  • +0

    を、どのように '2017/08/12' "半最古" とは?あなたは「二番目に古い」という意味ですか? – user2877959

    +0

    @ user2877959はい、私は「二番目に古い」という意味です。 – javimuu

    +0

    大丈夫です。しかし、私はまだあなたの望む結果を理解していません。なぜポートフォリオ1のエントリがないのですか?そして、写真#7はポートフォリオ2で2番目に古い写真ですか? #5ではないでしょうか? ... – user2877959

    答えて

    1

    私は2つのGROUP BY構成を使用しました。私はそれがRadimよう

    select photos.port_id, min(photos.id), min(photos.created_at) 
    from photos 
    join 
    (
        select port_id, min(created_at) photos_ca_min 
        from photos 
        where user_id is not null 
        group by port_id 
    ) p on p.port_id = photos.port_id 
    where photos.created_at > p.photos_ca_min and user_id is not null 
    group by photos.port_id 
    

    SQLFiddle

    1

    重要であると思われませんので、これは何もしないよう、私は、ポートフォリオに参加する必要性を理解していないPortfoliosテーブルを省略しています。

    しかし
    SELECT port_id, port_name, id as photo_id, created_at as photo_created_at FROM 
    (select *, row_number() OVER (PARTITION BY port_id ORDER By created_at) AS rn from 
    photos WHERE user_id IS NOT NULL) r 
    WHERE r.rn = 2 
    

    が、port_nameが写真で繰り返されていなかった場合のポートフォリオへのリンクに意味があるだろう:私のソリューションは、ROW_NUMBER()関数を使用しています!理論的には、port_nameは写真の中にあってはならない!

    編集

    あなたが写真からport_nameを削除した場合、あなたが必要とする:あなたの例ではこれら4つの日付のうち

    SELECT r.port_id, p.port_name, r.id as photo_id, r.created_at as photo_created_at FROM 
    (select *, row_number() OVER (PARTITION BY port_id ORDER By created_at) AS rn from 
    photos WHERE user_id IS NOT NULL) r INNER JOIN portfolios p on p.id = r.port_id 
    WHERE r.rn = 2 
    
    +0

    あなたは正しいです。 Port_nameは写真には入れないでください。 – javimuu

    +0

    写真からポート名を削除したものを表示 –

    +0

    ありがとうございました! – javimuu

    関連する問題