【问题标题】:most efficient way to write this sql query?编写此 sql 查询的最有效方法是什么?
【发布时间】:2012-07-17 03:25:31
【问题描述】:

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

Animals 表包含以下列:animal_idfarmer_idtypeborn_on

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

我需要做的是获取农民的所有 farmer_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

【问题讨论】:

  • 这几乎失控了。抱歉,如果我删除了任何有用的 cmets - 太吵了,我无法从线程中找出任何有建设性的内容。

标签: php mysql sql


【解决方案1】:

这有点困难,因为 MySQL 没有 Row_Number() 所以你需要模拟它。一种方法是使用自联接和计数。你也可以使用@rownumbertechnique 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 有 3 只羊,它们也不在最后 10 只中

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢第一个建设性的回复!我同意 PHP 可能会使事情变得更容易,但就大小而言,让我们说 Animal 的表中有 3000 万行(那些动物喜欢把它放在上面)。另外,我不能只选择 3 只羊,因为可能会有数百万只羊都具有不同的 animal_id。
    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多