-5

我相当不错并且正在编写 SQL 查询,但我的大脑一直在旋转,试图找出编写查询的最佳方法。这是设置:

动物有列:animal_idfarmer_idtypeborn_on

这张表中有很多行,记录了每个农民的所有动物出生情况。

我需要做的是获取农民的所有农民 ID,在他们最近的 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() 所以你需要模拟它。一种方法是使用自联接和计数。您也可以使用@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 |

结果只有 2,因为即使 3 有三只羊,它们也不在最后 10 只

于 2012-07-17T04:47:23.837 回答
0

假设您使用的是 PHP(在此处标记),而不是进行一次查询,进行多次查询并进行选择(通用或绵羊)要简单得多

或者,选择三只羊,获取指数,然后再选择七只羊,其中指数不是前三只羊的指数。

于 2012-07-17T04:38:30.607 回答