Php 编写此sql查询的最有效方法是什么?
我写SQL查询相当不错,但我的大脑一直在旋转,试图找出编写查询的最佳方法。以下是设置: 表动物有列:动物id,农民id,类型,出生日期 这张桌子上有成吨的行,记录着每个农民的所有动物出生 我需要做的是获得所有农民的农场主ID,在最近的10次动物出生中,至少有3次是“绵羊”类型。 感谢您的帮助 这是我的尝试:Php 编写此sql查询的最有效方法是什么?,php,mysql,sql,Php,Mysql,Sql,我写SQL查询相当不错,但我的大脑一直在旋转,试图找出编写查询的最佳方法。以下是设置: 表动物有列:动物id,农民id,类型,出生日期 这张桌子上有成吨的行,记录着每个农民的所有动物出生 我需要做的是获得所有农民的农场主ID,在最近的10次动物出生中,至少有3次是“绵羊”类型。 感谢您的帮助 这是我的尝试: SELECT a.farmer_id FROM Animals a WHERE (select count(game_id) from Animals b
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
假设您使用的是PHP(此处标记),而不是进行一个查询,那么进行多个查询并进行选择(常规或sheep)会简单得多
或者,选择三只羊,获取索引,再选择七只,其中索引不是前三只羊的索引。这有点困难,因为MySQL没有Row_Number(),所以需要模拟它。一种方法是使用自联接和计数。您也可以使用
@rownumber
在我的示例中,我使用animal_id查找最近的,但您可能希望将连接条件更改为和t1.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
结果只有2只,因为尽管3有3只羊,但它们不在最后10只羊中谢谢你的第一个建设性回复!我同意PHP可能会让事情变得更简单,但就大小而言,让我们只说动物的表中有3000万行(这些动物喜欢放在上面)。此外,我不能只挑选3只羊,因为可能会有数百万只羊都有不同的动物ID,几乎失控。抱歉,如果我删除了任何有用的评论-有太多的噪音让我无法从帖子中找出任何有建设性的东西。
| 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 |