2017-11-10 2 views
0

これは比較的簡単な質問かもしれませんが、私はそれを解決するために苦労しています。私は3つのテーブルすべて(owners, pets, petTypes)と次のデータを1つのクエリのすべてを抽出しようとしている。最初の2つは難しいことではありませんが、3番目と4番目は私が苦労している場所です。 https://pastebin.com/veXHwcMc列のMAX値と別の値から対応する値を選択

質問:

  1. 所有者ID

  2. 所有者名

  3. 所有者最古のペットの年齢
  4. 所有者最古のペットを

    表のデータは、あなたが複製する場合タイプ名

  5. 私は SELECT MAX(age) FROM pets

    SELECT pets.ownerId, MAX(pets.age), petTypes.name FROM pets INNER JOIN petTypes ON pets.petTypeId = petTypes.id GROUP BY pets.ownerId;

    の両方を表示するためにテーブルの結合しかし、これは間違っている最古の年齢を選択

    を試してみましたが、どのような他のペットの

。最も古い猫の正しい名前を表示する必要があるとき、彼らはすべて猫を見せているからです。

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?は、だから私は未遂:

が、私はこの質問をすると、カムSELECT petTypes.id, petTypes.name FROM petTypes INNER JOIN (SELECT MAX(age) FROM pets GROUP BY ownerId) pets ON petTypes.id = pets.petTypeId;

しかし、スローエラーがあるERROR 1054 (42S22): Unknown column 'petTypes.id' in 'on clause'

すべてのヘルプしてください

tables + the data

+0

オーナーごとに最も古いペットの年齢のデータを取得できますか?これを使用してデータに参加し、所有者とペットの年齢に参加して表示されるペットの結果を制限できますか?複数のペットの年齢が同じであれば何が起こりますか?それらのすべてを望んでいますか、それとも1つしかありませんか?どのように決定するのですか? – xQbert

+0

私は最も古いペットAND名を取得しようとしています。オーナーに同じ年齢の人が複数いる場合、私は1人だけ必要です – Nouman

+0

まだ苦労している人は、次の記事を参照してください:[私は非常に単純なSQLクエリであると思われる?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql -query) – Strawberry

答えて

0

Working demo:

SELECT O.ID, O.FirstName, O.LastName, P.Age, min(PT.Name) as TypeName, OPets.CntOfOtherPets 
FROM Owners O 
INNER JOIN (SELECT OwnerID, max(Age) MA, count(*)-1 as CntOfOtherPets 
      FROM Pets 
      GROUP BY OwnerID) OPets 
on OPets.OwnerID = O.ID 
INNER JOIN Pets P 
on P.Age = OPets.MA 
and P.OwnerID = OPets.OwnerID 
INNER JOIN PetTypes PT 
on P.PetTypeID = PT.ID 
GROUP BY O.ID, O.FirstName, O.LastName, P.Age, OPets.CntOfOtherPets ; 

派生テーブルOPetsは、「他のペット」の数を表していることがわかっているので、所有者以下のすべてのペットの数を1より少なくします。最大のペットの年齢は、グループ化された集団を介して返されます。このデータセットをペットセットに戻すことによって、最大の年齢のペットのペットだけが得られます。次に、そのタイプのペットの名前を取得するためにpetTypeに参加します(複数の共有が同じ最大年齢の場合はペット)。

最後に、PT.Nameを除くすべてのフィールドでグループ化し、min(PetType.Name)を選択します。このように、同じ年齢の複数の動物が存在する場合は、アルファベット順に最古の名前を持つTypeNameを持つ動物を選択します。このアプローチは、返されるデータがある場合にのみ機能します。ペットネームやペットIDが返されなければならない場合、別のアプローチが必要になります。

count-1はcount(*)がすべてのペットの数を返すので少しヒットしそうです-1は私たちが知っていたことを知っています#5の要件の場合:その他ペットの数。年齢の関係があっても、これは正しいでしょう。カウント1は常に「他のペット」になるので

+0

このようなlenghtlyの回答をありがとうと、残念なことに、あなたが何をしたのか説明します。エラー1054(42S22): 'フィールドリスト'の 'Opets.CntOfOtherPets'の列が不明です。私は 'CntOfOtherPEts'が 'CntOfOtherPets'に変更されたので、事故でキャップされたと仮定しましたが、エラーを修正しませんでした – Nouman

+0

何が間違っているのか分かりません。テーブル/データをモックアップする必要があります。私は "as"を追加し、スペルの一貫性を保証しました。それが問題を解決したかどうかはわかりません。 – xQbert

+0

テストする場合は、テーブルデータを追加しました:https://pastebin.com/veXHwcMc – Nouman

0

これはうまくいくはずですが、所有者に同じ年齢のペットが2人以上いる場合は複数のレコードが表示されます。

Select ow.Firstname, ow.lastname ,petinfo.Age, petinfo.Name, petcount.TotalPets 
    from #owners ow 
    join (Select age, p.petTypeId, p.OwnerID, pt.name From 
       (select max(age) as age, petTypeId, OwnerID 
       from #pets p 
       Group by OwnerID,petTypeId 
       ) p 
      Join #petTypes pt on pt.ID = p.petTypeId 
      ) petinfo 
      on petinfo.OwnerID = ow.id 
    Join (
      Select Count(*) TotalPets, ownerID 
      From #Pets 
      group by OwnerID 
     ) petcount 
     on petcount.ownerID = ow.ID 
+0

未知の列の年齢'in'フィールドリスト '。また、すべてのテーブル名が小文字で始まるので、該当する箇所を変更しました。どのタイプのテーブルが由来しているのか分からない? – Nouman

関連する問題