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 LEFT OUTER JOIN照片 p ON c.celeb_id =p.celeb_id order by rand() limit 1;

于 2013-01-26T16:42:23.713 回答
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 回答
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 回答