2009-03-26 15 views
1

私はSQLでこのクエリを書く方法がわかりません。 2つのテーブルがあります複雑なsqlクエリのヘルプが必要

SchoolYearが '2000'のGroupRecordsに属する人のリストを返します。返されたリストでは、people.nameは一意である必要があります(People.Nameは重複しません)。重複の場合は、後のRecordDateを持つGroupRecordに属する人のみが返されます。

この権利のためにストアドプロシージャを記述する方が良いでしょうか?

+0

はこの宿題ですか? –

+0

いいえ学校のウェブサイトの場合 – ssl

+0

と私は既存の構造を変更できません。 – ssl

答えて

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 
    ) 
+0

同じRecordDateを持つ2つのグループレコードがある場合、groupwise maximumへのこのアプローチは複数の行を返します。 – bobince

+0

そうですね、いいところです。同じRecordDateに同じ名前の2人が選択されますが、日付が同じ場合は、どれが最新のものを選択するのですか? – Martin

0
Select Distinct ID 
From People 
Where GroupRecordsID In 
    (Select Id From GroupRecords 
    Where SchoolYear = '2000/1/1') 

これは ... 2000クラスでそれらの個人の明確なリストを生成しますが、私はあなたが重複についてcpmmentとで取得しているかを理解していない...手の込んだください...

2人の異なる人が同じ名前を持っていると話しているように読んでいますが、両方の名前が表示されないようにしています...それは本当に必要なものですか?

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' 
0

people.nameは一意でなければなりません(無重複People.Name)

?確かにPeople.IDの重複はありませんか?

重複の場合は、後でRecordDateのGroupRecordsに所属する人のみが返されます。

普通のSQLのやり方は明らかではありません。 「各Xについて、行Yを最大/最小Zで選択する」にはいくつかのアプローチがあります。どのデータベースソフトウェアが使用しているかに依存してより優れたパフォーマンスを発揮します。

http://kristiannielsen.livejournal.com/6745.htmlには、これを攻撃するための一般的なテクニック(MySQLの文脈では広く適用されています)についていくつかの良い議論があります。