0

次の出力が必要です。

有名人とその写真をデータベースに入れたいです。各有名人には複数の写真がある場合があります。各写真には複数の有名人が写っている場合があります

有名人が複数の写真を持っている場合は、有名人の名前が付いたランダムな写真を取得する必要があります。

こんな感じでテーブルを作りました。

有名人テーブル (有名人):

id 
name

写真テーブル (写真):

id
photo location

有名人と写真の結合テーブル (Celebrity_Photos):

Celebrity id
Photos id

しかし、期待される結果を得るための正しいクエリがわかりません。または、テーブルを間違って設計した可能性があります。

これを行うための最良の方法を提案してください。

結合クエリを知っています。しかし、基本的な結合クエリは知っています。このような情報を提供します。

celeb1 photo1
celeb1 photo2
celeb2 photo1

しかし、私は達成しようとしています

 celeb1 photo2
 celeb2 photo1

また

celeb1 photo1
celeb2 photo1
4

6 に答える 6

1

idすべての有名人の最小の写真:

SELECT 
    c.*                        -- columns you need from Celebrity
  , p.*                        -- and Photo tables
FROM 
    celebrity AS c
  LEFT JOIN 
    ( SELECT celebrity_id
           , MIN(photo_id) AS photo_id
      FROM celebrity_photo
      GROUP BY celebrity_id
    ) AS cp
      ON cp.celebrity_id = c.celebrity_id
  LEFT JOIN 
    photo AS p
      ON p.photo_id = cp.photo_id ;

すべての有名人のランダムな写真:

SELECT 
    c.*                        -- columns you need from Celebrity
  , p.*                        -- and Photo tables
FROM 
    celebrity AS c
  LEFT JOIN 
    photo AS p
      ON p.photo_id = 
        ( SELECT cp.photo_id 
          FROM celebrity_photo AS cp
          WHERE cp.celebrity_id = c.celebrity_id 
          ORDER BY RAND()
              LIMIT 1
        ) ;
于 2013-01-26T15:49:24.100 に答える
0

1枚の写真に複数の有名人がいると思います。もしそうなら、あなたのデザインはちょうどいいです。

では、これはどうですか。

SELECT Celebrity.name, Photos.photo_location
FROM Celebrity_Photos
INNER JOIN Celebrity on Celebrity.id = Celebrity_Photos.celeb_id
INNER JOIN Photos on Photos.id = Celebrity_Photos.photo_id
ORDER BY rand()
LIMIT 1

写真を1枚だけ返却したいと思います。そうでない場合は、単に行を削除します。

LIMIT 1
于 2013-01-26T16:42:08.793 に答える
0

結合テーブル(関連付けテーブル)は必要ありません。「多対多」ではないため、写真テーブルに別の列を追加します。celeb_id外部キーを指定する場合があります。次にSELECT * FROM Celebrity c LEFTOUTERJOINを使用します。写真pONc.celeb_id = p.celeb_id rand()による注文制限1;

于 2013-01-26T16:42:23.713 に答える
0

これを使って:

SELECT * FROM (SELECT RAND() RND_INDEX, P.PHOTO_ID, P.PHOTO_LOCATION, C.ID, C.NAME
FROM PHOTOS P, CELEBRITY_PHOTOS CP, CELEBRITY C
WHERE P.PHOTO_ID = CP.PHOTO_ID AND CP.ID = DESIRED_CELEBRITY AND CP.ID = C.ID) A ORDER BY RND_INDEX LIMIT 1
于 2013-01-26T15:46:26.970 に答える
0

仮定 - 複数の有名人が写っている写真は考慮されていません。訂正 - 結合テーブルと呼ばれるものの正しい用語は関連テーブルです。

あなたの構文は問題ないと思います。ランダムな側面は少し複雑になるため、クエリの外で行う必要があります。


テーブルまたはコードがどのように設定されるかはわかりませんが、有名人のリストをループしているか、有名人の ID または名前 (私は $celebrity_id を使用しています) を持っていると仮定した場合のクエリを次に示します。

SELECT PHOTO_T.id 
FROM PHOTO_T, CELEBRITY_PHOTO_A, CELEBRITY_T
WHERE PHOTO_T.id = CELEBRITY_PHOTO_A.photo_id AND CELEBRITY_PHOTO_A.celebrity_id = CELEBRITY_T.id AND CELEBRITY_T.id = $celebrity_id
ORDER BY RAND() LIMIT 0,1;

RAND() を使用するとパフォーマンスが低下する可能性がありますが、必要なものが得られます。

于 2013-01-26T15:53:03.890 に答える
0

私のアプローチ:

[CELEB]  
celeb_id
celeb_name  

[CELEB_PHOTO]  
celeb_photo_id
celeb_id
photo_name

あなたのデザインは問題ありません。mo に膨大な量のレコードがない場合は、以下のクエリから始めます。

SELECT * FROM `CELEB_PHOTO` WHERE `celeb_id` = $celeb_id ORDER BY RAND() LIMIT 1 

次に、CELEB テーブルにクエリを実行してセレブの名前を取得できます。

于 2013-01-26T15:44:53.093 に答える