需要复杂的sql查询帮助

时间:2009-03-26 01:58:01

标签: sql

我不确定如何在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的人。

为此编写存储过程可能会更好吗?

4 个答案:

答案 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
    )