-5

私はかなりまともで SQL クエリを書いていますが、クエリを書くための最良の方法を見つけようとして頭が回転しています。セットアップは次のとおりです。

Animalsには次の列があります: animal_idfarmer_idtypeborn_on

このテーブルには大量の行があり、各農家のすべての動物の誕生が記録されています。

私がする必要があるのは、農家のすべての farmer_ids を取得することです。彼らの最新の 10 頭の動物の出産のうち、少なくとも 3 頭が「羊」タイプです。

どんな助けでも大歓迎です!

これは私の試みでした:

SELECT a.farmer_id
  FROM Animals a
 WHERE
    (select count(game_id)
       from Animals b
      where b.farmer_id = a.farmer_id
      ORDER BY born_on DESC LIMIT 10) >= 3
4

2 に答える 2

2

MySQLにはRow_Number()がないため、これはもう少し難しいので、シミュレートする必要があります。1つの方法は、自己結合とカウントを使用することです。ここで説明する手法を使用することもできます@rownumber

私の例では、animal_idを使用して最新のものを検索しましたが、JOIN条件を次のように変更することもできます。 AND t1.born_on < t2.born_on

SELECT farmer_id 
FROM 
(

SELECT t1.farmer_id, 
       t1.animal_id, 
       Count(t2.animal_id) rn, 
       t1.type 
FROM   table1 t1 
       LEFT JOIN table1 t2 
              ON t1.farmer_id = t2.farmer_id 
                 AND t1.animal_id < t2.animal_id 
GROUP  BY t1.farmer_id, 
          t1.animal_id, 
          t1.type
    ) as t
WHERE RN < 10
and type = 'Sheep'
HAVING COUNT(animal_id) >= 3

デモ

使用したサンプルデータ

| ANIMAL_ID | FARMER_ID |  TYPE |
---------------------------------
|         1 |         1 |   dog |
|         2 |         1 |   dog |
|         3 |         1 |   dog |
|         4 |         1 |   dog |
|         5 |         1 |   dog |
|         6 |         1 |   dog |
|         7 |         1 |   dog |
|         8 |         1 |   dog |
|         9 |         1 |   dog |
|        10 |         1 |   dog |
|        11 |         2 |   dog |
|        12 |         2 |   dog |
|        13 |         2 |   dog |
|        14 |         2 |   dog |
|        15 |         2 |   dog |
|        16 |         2 |   dog |
|        17 |         2 | sheep |
|        18 |         2 | sheep |
|        19 |         2 | sheep |
|        20 |         3 | sheep |
|        21 |         3 | sheep |
|        22 |         3 | sheep |
|        23 |         3 |   cat |
|        24 |         3 |   cat |
|        25 |         3 |   cat |
|        26 |         3 |   cat |
|        27 |         3 |   cat |
|        28 |         3 |   cat |
|        29 |         3 |   cat |
|        30 |         3 |   cat |

3頭には3頭の羊がいますが、過去10頭にはなかったため、結果は2頭になります。

于 2012-07-17T04:47:23.837 に答える
0

PHP(ここでタグ付けされている)を使用していると仮定すると、1つのクエリを作成する代わりに、複数のクエリを作成して選択(一般または羊)を行う方がはるかに簡単です。

または、3頭の羊を選択してインデックスを取得し、インデックスが最初に選択した3頭の羊のインデックスではない場合はさらに7頭を選択します。

于 2012-07-17T04:38:30.607 に答える