Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 编写此sql查询的最有效方法是什么?_Php_Mysql_Sql - Fatal编程技术网

Php 编写此sql查询的最有效方法是什么?

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

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

动物有列:动物id农民id类型出生日期

这张桌子上有成吨的行,记录着每个农民的所有动物出生

我需要做的是获得所有农民的农场主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

假设您使用的是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 |