我试图从我的数据库中提取“人物”的集合,以在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
答案 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在这种情况下未定义的行为,因此未定义您为每个人获得的照片。