14

1 対多の関係にある 2 つのテーブルがあるとします。

また、関連テーブルの最初のレコードとともに、各メイン レコードから列を選択したいと考えています。

色々やってみたけど上手くいかない…

ここで、この SQL フィドルで終了します。

http://sqlfiddle.com/#!2/39fdb/3

問題は、サブセレクトから a.ID を参照できないことです。

もちろん、これは機能しませんが、私が考えることができるのはそれだけです

select a.*,b.* from event a left join 
(select * from event_pictures where a.ID=article limit 1)
b on a.ID=b.article;

それを修正する方法についてのアイデアはありますか?

4

4 に答える 4

29

a.IDいいえ、に結合されているサブセレクトで参照することはできませんa。次のことを行うことができますが、順序を指定することをお勧めします。それ以外の場合、「最初の」行はありません。テーブル b から (多かれ少なかれ) ランダムな行が選択されます。

select a.*, b.* 
from event a 
  left join event_pictures b
    on b.PK =                        --- the PRIMARY KEY
       ( select bb.PK                --- of event_pictures 
         from event_pictures bb 
         where a.ID = bb.article
         ORDER BY bb.something 
         limit 1
       ) ;
于 2012-08-09T14:20:28.057 に答える
2

既に提案されているように、min または max を使用できます。

select
    e.*,
    (
        select min(ep.img)
        from event_pictures as ep
        where ep2.article = e.article
    ) as img
from
    event as e

最も高い ID に基づいて img が必要な場合:

select
    e.*,
    (
        select ep2.img
        from event_pictures as ep2
        where ep2.ID = last_ep.last_ID
    ) as img
from
    event as e inner join -- could be a left join if necessary
    (
        select ep.article, max(ep.ID) as last_ID
        from event_pictures as ep
        group by ep.article
    ) as last_ep
        on last_ep.article = e.ID

どちらのアプローチも を使用する必要はありませんlimit

于 2012-08-09T14:31:16.133 に答える
2

記事に対してどの画像が返されるかを気にしない場合は、サブクエリで( を実行するのではなく) 記事ごとにグループ化されたMINまたはの画像を選択できます。MAXLIMIT 1

SQL フィドル

于 2012-08-09T14:21:55.700 に答える
0

これを行う1つの方法は次のとおりです。

select e.*, ep.*
from (select e.*,
             (select article
              from event_pictures ep
              where ep.article = e.id
              order by rand()
              limit 1
             ) as eparticle
      from event e
     ) e left join
     event_pictures ep
     on e.eparticle = ep.article

サブクエリは、ランダムな「記事」を 1 つ見つけます。このための情報が結合されます。

于 2012-08-09T14:22:00.333 に答える