MySQL的;从三个表中选择时,从一个表中限制记录

时间:2014-06-18 11:30:34

标签: mysql

我试图从我的数据库中提取“人物”的集合,以在HTML页面中显示为列表。一个人可以属于一个或多个类别。一个人可以有一张或多张照片。

我想要做的是获取属于特定类别的人员集合,这对我来说相当简单:

  

SELECT * FROM persons,personcategorylookup WHERE   personcategorylookup.personUID = persons.uID AND   personcategorylookup.categoryUID = 1

但是,我还想为每个人抓取最新上传的照片。他们可能上传了很多照片,但我只想要最新的,基于照片表中的uploadDate。

我尝试了以下查询:

  

SELECT * FROM人,personcategorylookup,照片在哪里   personcategorylookup.personUID = persons.uID AND   personcategorylookup.categoryUID = 1 AND photos.personUID =   persons.uID

然而,这显然不会限制来自照片表的记录数量,因此我最终会为每个人提供多条记录。

我真正想做的是:

  

SELECT * FROM人物,personcategorylookup,照片...... ...... ORDER BY   photosTableOnly uploadDate LIMIT photosTableOnly 0,1

我也尝试了UNION SELECT查询,但列数不同,因此不起作用。

最后,我尝试了一个可以正常工作的子查询,但显然我一次只能拉出一列,我觉得我可能不必要地锤击MySQL服务器:

  

SELECT *,(SELECT源FROM人员,照片WHERE personUID =   persons.uID ORDER BY uploadDate LIMIT 0,1)AS来源人员,   personcategorylookup在哪里personcategorylookup.personUID =   persons.uID和personcategorylookup.categoryUID = 1

我的表格如下:

人员表

PK int uID
VARCHAR name

类别表

PK int uID
VARCHAR label

PersonCategoryLookup表

PK personUID
PK categoryUID

照片表

PK personUID
PK photoSource
DATETIME uploadDate

2 个答案:

答案 0 :(得分:2)

假设上传日期对于某个人来说是唯一的,请使用子查询获取每个人的最新照片日期,并将其与照片表相关联: -

SELECT * 
FROM persons
INNER JOIN personcategorylookup ON personcategorylookup.personUID = persons.uID
INNER JOIN 
(
    SELECT personUID, MAX(uploadDate) AS latest_photo_date
    FROM photos 
    GROUP BY personUID
) sub0
ON sub0.personUID = persons.uID
INNER JOIN photos ON sub0.personUID = photos.personUID AND sub0.latest_photo_date = photos.uploadDate
WHERE personcategorylookup.categoryUID = 1

答案 1 :(得分:1)

试试这个:

SELECT 
    *
FROM 
    persons 
JOIN 
    personcategorylookup ON (personcategorylookup.personUID = persons.uID AND  personcategorylookup.categoryUID = 1)
LEFT JOIN 
    photos ON (persons.uID = photos.personUID)
GROUP BY persons.uID;

这里的小提琴:http://sqlfiddle.com/#!2/d68b1/1

注意: @Kickstart正确地指出,由于GROUP BY在这种情况下未定义的行为,因此未定义您为每个人获得的照片。