写这个SQL查询最有效的方法?

时间:2012-07-17 03:25:31

标签: php mysql sql

我非常体面并且编写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

2 个答案:

答案 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

DEMO

使用的样本数据

| 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(在此处标记),而不是进行一次查询,那么进行多次查询并进行选择(一般或绵羊)会更简单

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