繁体   English   中英

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

[英]MySQL; limiting records from one table when selecting from three

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

我想做的是获取属于特定类别的人员的集合,即使对于我来说,这也非常简单:

SELECT * FROM person,personcategorylookup在哪里personcategorylookup.personUID = person.uID和personcategorylookup.categoryUID = 1

但是,我也想为每个人获取最新上传的照片。 他们可能已经上传了许多照片,但我只想根据照片表中的uploadDate最新的照片。

我尝试了以下查询:

选择*从人员,personcategorylookup,照片中,其中personcategorylookup.personUID = person.uID和personcategorylookup.categoryUID = 1并且photos.personUID = person.uID

但是,这显然并没有限制来自photos表的记录数量,因此我最终为每个Person添加了多条记录。

我实际上想要做的是:

SELECT * FROM person,personcategorylookup,photos………排序按photosTableOnlyDate LIMIT photosTableOnly 0,1

我也尝试了UNION SELECT查询,但列数不同,因此无法正常工作。

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

SELECT *,(从人员,照片中选择源,其中personUID = person.uID,ORDER BY BYDATEDATE 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

尝试这个:

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的行为不确定,因此您无法为每个人获取哪张照片。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM