我希望得到以下输出。
我想在数据库中有名人和他们的照片。 每个名人可能有不止一张照片。每张照片可能有多个名人
如果一位名人有一张以上的照片,我需要随机拍一张名人的照片。
我设计了这样的表格。
名人表(名人):
id
name
照片表(照片):
id
photo location
名人和照片的联接表(Celebrity_Photos):
Celebrity id
Photos id
但我不知道正确的查询来获得预期的结果。 或者我可能错误地设计了表格。
建议我这样做的最好方法。
我知道连接查询。但我知道基本的连接查询。它给出了这样的信息。
celeb1 photo1
celeb1 photo2
celeb2 photo1
但我希望能够实现
celeb1 photo2
celeb2 photo1
OR
celeb1 photo1
celeb2 photo1
答案 0 :(得分: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
) ;
答案 1 :(得分: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表获得名人名称。
答案 2 :(得分: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
答案 3 :(得分: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()可能会降低性能,但它会为您提供所需的效果。
答案 4 :(得分:0)
我假设你可能在一张照片中有几个名人。如果是这样,你的设计就好了。
那么,这个怎么样;
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
答案 5 :(得分:0)
您不需要连接表(关联表),因为它不是“多对多”将另一列添加到您的照片表celeb_id您可能想要将其指定为外键..然后使用 SELECT * FROM Celebrity c LEFT OUTER JOIN照片p ON c.celeb_id = p.celeb_id order by rand()limit 1;