设计mysql表

时间:2013-01-26 15:38:27

标签: php mysql database

我希望得到以下输出。

我想在数据库中有名人和他们的照片。 每个名人可能有不止一张照片。每张照片可能有多个名人

如果一位名人有一张以上的照片,我需要随机拍一张名人的照片。

我设计了这样的表格。

名人表(名人):

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

6 个答案:

答案 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;