2

3つのテーブル(photos、albums、album_photos)からデータを取得しようとしています。次に、プログラムはアルバムテーブルでユーザーのアルバムを検索し、album_photosで写真のIDをすべてのアルバムで検索し、IDごとに写真の表を見て、IDごとにすべてのデータを確認してください。

昨日、次のような質問をしました。3つのテーブルを使用した内部結合ですが、今は質問が違うと思います。どうすればリクエストに制限を追加できるのでしょうかinner join

だから、私は今このコードで働いています:

SELECT a.album_name, a.album_id, c.* 
FROM albums a
INNER JOIN album_photos b ON a.album_id = b.album_id
INNER JOIN photos c ON b.photo_id = c.photo_id
WHERE (
  SELECT COUNT(*) 
  FROM album_photos d
  WHERE b.album_id = d.album_id
  AND d.nick =  :nick
) <=5

このコードは、写真が5枚以下のアルバムを選択します。コードにそのようなことをさせたくありません。アルバムに含まれる写真の数に関係なく、5枚の写真を制限してアルバムを表示したいと思います。

他の人からはできないと言われましたが、SQL言語は非常に複雑で、それを行うためのツールが必要だと思います。

これを適切な方法で行う方法はありますか?

*上記で共有しているリンクに、出力データの例を示します。

4

2 に答える 2

2

where句を次のように変更してみてください。

WHERE (
  SELECT COUNT(*) 
  FROM album_photos d
  WHERE d.album_id = b.album_id and
        d.photo_id <= b.photo_id
  AND d.nick =  :nick
) <= 5

これは、アルバム内の写真の数だけでなく、順番に写真の数をカウントします。

于 2013-03-19T21:26:53.320 に答える
0

album_photosには写真とアルバムのマッピング関係があるため、TOPを使用して参加する写真の数を指定できます。

SELECT a.album_name, a.album_id, p.* 
FROM albums a
INNER JOIN album_photos ap ON 
   ap.photo_id = (select top 5 photo_id from album_photos where a.album_id = ap.album_id order by photo_id)
INNER JOIN photos p ON ap.photo_id = p.photo_id

サブクエリのphoto_idによる順序により、同じ5枚(またはそれ以下)の写真が返されるようになります

コメントごとに編集します。T-SQLTOPの代わりにMySqlLIMITを使用するように変更する

SELECT a.album_name, a.album_id, p.* 
FROM albums a
INNER JOIN album_photos ap ON 
   ap.photo_id = (select photo_id from album_photos where a.album_id = ap.album_id order by photo_id LIMIT 0, 5)
INNER JOIN photos p ON ap.photo_id = p.photo_id
于 2013-03-19T21:46:44.983 に答える