私はSQLでこのクエリを書く方法がわかりません。 2つのテーブルがあります複雑なsqlクエリのヘルプが必要
SchoolYearが '2000'のGroupRecordsに属する人のリストを返します。返されたリストでは、people.nameは一意である必要があります(People.Nameは重複しません)。重複の場合は、後のRecordDateを持つGroupRecordに属する人のみが返されます。
この権利のためにストアドプロシージャを記述する方が良いでしょうか?
私はSQLでこのクエリを書く方法がわかりません。 2つのテーブルがあります複雑なsqlクエリのヘルプが必要
SchoolYearが '2000'のGroupRecordsに属する人のリストを返します。返されたリストでは、people.nameは一意である必要があります(People.Nameは重複しません)。重複の場合は、後のRecordDateを持つGroupRecordに属する人のみが返されます。
この権利のためにストアドプロシージャを記述する方が良いでしょうか?
これはテストされていませんが、質問に必要なことを行う必要があります。
人に関するすべての詳細を選択します。
サブクエリは、単一の名前の最新の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
)
Select Distinct ID
From People
Where GroupRecordsID In
(Select Id From GroupRecords
Where SchoolYear = '2000/1/1')
これは ... 2000クラスでそれらの個人の明確なリストを生成しますが、私はあなたが重複についてcpmmentとで取得しているかを理解していない...手の込んだください...
2人の異なる人が同じ名前を持っていると話しているように読んでいますが、両方の名前が表示されないようにしています...それは本当に必要なものですか?
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'
people.nameは一意でなければなりません(無重複People.Name)
?確かにPeople.IDの重複はありませんか?
重複の場合は、後でRecordDateのGroupRecordsに所属する人のみが返されます。
普通のSQLのやり方は明らかではありません。 「各Xについて、行Yを最大/最小Zで選択する」にはいくつかのアプローチがあります。どのデータベースソフトウェアが使用しているかに依存してより優れたパフォーマンスを発揮します。
http://kristiannielsen.livejournal.com/6745.htmlには、これを攻撃するための一般的なテクニック(MySQLの文脈では広く適用されています)についていくつかの良い議論があります。
はこの宿題ですか? –
いいえ学校のウェブサイトの場合 – ssl
と私は既存の構造を変更できません。 – ssl