我非常体面并且编写SQL查询,但是我的大脑一直在试图找出编写查询的最佳方法。这是设置:
表动物包含以下列: animal_id , farmer_id ,类型, born_on
此表中有大量行,记录每个农民的所有动物出生。
我需要做的是让农民的所有农民在最近的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
答案 0 :(得分:2)
这有点困难,因为MySQL没有Row_Number()所以你需要模拟它。一种方法是使用自联接和计数。您还可以使用@rownumber
technique described here
在我的示例中,我使用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只
答案 1 :(得分:0)
假设您使用的是PHP(在此处标记),而不是进行一次查询,那么进行多次查询并进行选择(一般或绵羊)会更简单
或者,选择三只绵羊,获取指数,再选择七只,其中指数不是前三只羊的指数。