我不确定如何在SQL中编写此查询。有两个表
**GroupRecords**
Id (int, primary key)
Name (nvarchar)
SchoolYear (datetime)
RecordDate (datetime)
IsUpdate (bit)
**People**
Id (int, primary key)
GroupRecordsId (int, foreign key to GroupRecords.Id)
Name (nvarchar)
Bio (nvarchar)
Location (nvarchar)
返回属于具有SchoolYear为“2000”的GroupRecords的不同人员列表。在返回的列表中,people.name应该是唯一的(没有重复的People.Name),如果是重复,则只返回属于具有后一个RecordDate的GroupRecords的人。
为此编写存储过程可能会更好吗?
答案 0 :(得分:0)
Select Distinct ID
From People
Where GroupRecordsID In
(Select Id From GroupRecords
Where SchoolYear = '2000/1/1')
这将产生2000年级中这些人的明显列表...... 但我不明白你对cpmment关于重复的问题...请详细说明......
看起来好像你在谈论当两个不同的人碰巧有相同的名字时你不希望他们两个都列出来......这真的是你想要的吗?
答案 1 :(得分:0)
MySQL特定:
SELECT *
FROM `People`
LEFT JOIN `GroupRecords` ON `GroupRecordsId` = `GroupRecords`.`Id`
GROUP BY `People`.`Name`
ORDER BY `GroupRecords`.`RecordDate` DESC
WHERE `GroupRecords`.`SchoolYear` = '2000/1/1'
答案 2 :(得分:0)
people.name应该是唯一的(没有重复的People.Name)
?当然你的意思是没有重复的People.ID?
如果是重复,则只返回属于具有后期RecordDate的GroupRecords的人。
有一点点 - 那就是在纯SQL中如何处理并不明显。 “对于每个X,选择具有最大/最小Z的行Y”问题有多种方法;哪种工作和哪种工作表现更好取决于您使用的数据库软件。
http://kristiannielsen.livejournal.com/6745.html对一些常用的攻击方法进行了一些很好的讨论(在MySQL的上下文中,但是广泛适用)。
答案 3 :(得分:0)
这是未经测试的,但应该按照问题的要求进行。
选择有关此人的所有详细信息。
子查询将使其仅匹配单个名称的最新RecordDate。由于ID之间的匹配,它也只能在正确的GroupRecord中查找。
SELECT
People.Id,
People.GroupRecordsId,
People.Name,
People.Group,
People.Bio,
People.Location
FROM
People
INNER JOIN GroupRecords ON GroupRecords.Id = People.GroupRecordsId
WHERE
GroupRecords.SchoolYear = '2000/1/1' AND
GroupRecords.RecordDate = (
SELECT
MAX(GR2.RecordDate)
FROM
People AS P2
INNER JOIN GroupRecords AS GR2 ON P2.GroupRecordsId = GR2.Id
WHERE
P2.Name = People.Name AND
GR2.Id = GroupRecords.Id
)