我试图从数据库中提取“人员”集合,以在HTML页面中显示为列表。一个人可以属于一个或多个类别。一个人可以有一张或多张照片。
我想做的是获取属于特定类别的人员的集合,即使对于我来说,这也非常简单:
选择*从人员中,personcategorylookup在哪里
personcategorylookup.personUID = person.uID和
personcategorylookup.categoryUID = 1
但是,我也想为每个人获取最新上传的照片。他们可能已经上传了许多照片,但我只想根据照片表中的uploadDate最新的照片。
我尝试了以下查询:
选择*从人物,人类别查找,照片中选择
personcategorylookup.personUID = person.uID和
personcategorylookup.categoryUID = 1和photos.personUID =
人员.uID
但是,这显然并没有限制来自photos表的记录数量,因此我最终为每个Person添加了多条记录。
我实际上想要做的是:
选择*从人物,personcategorylookup,照片中………………订购
photosTableOnly上传日期LIMIT张photosTableOnly 0,1
我也尝试了UNION SELECT查询,但列数不同,因此无法正常工作。
最后,我尝试了一个能正常工作的子查询,但显然我一次只能与这些子查询拉一列,而且我觉得我可能在不必要地锤击MySQL服务器:
SELECT *,(从人员,照片中选择源,其中personUID =
person.uID ORDER BY uploadDate LIMIT 0,1)作为人员的来源,
personcategorylookup在哪里personcategorylookup.personUID =
person.uID和personcategorylookup.categoryUID = 1
我的表格如下:
人表
PK int uID
VARCHAR name
分类表
PK int uID
VARCHAR label
PersonCategory查找表
PK personUID
PK categoryUID
照片表
PK personUID
PK photoSource
DATETIME uploadDate
最佳答案
假设上载日期对于一个人来说是唯一的,请使用子查询获取每个人的最新照片日期,并将其与照片表结合:
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