2012-07-17 78 views
-5

我很體面,寫SQL查詢,但我的大腦一直在旋轉,試圖找出編寫查詢的最佳方式。下面是設置:寫這個sql查詢最有效的方法是什麼?

動物有列:animal_idfarmer_idborn_on

此表萬噸這行的,記錄每個所有的動物出生農民。

我需要做的是獲得農民的最新動物分娩的所有farmer_ids,其中至少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

這幾乎失控了。對不起,如果我刪除了任何有用的評論 - 那裏有太多的噪音,我從線程中找出任何有建設性的東西。 – BoltClock 2012-07-17 06:09:31

回答

2

這有點難度,因爲MySQL沒有Row_Number(),所以你需要模擬它。一種方法是使用自連接和計數。你也可以使用@rownumbertechnique described here

在我的例子我用animal_id找到最近的,但你可能要聯接條件更改爲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只羊ey不在最後10個

0

假設你正在使用PHP(這是這裏的標籤),而不是做一個查詢,這是一個簡單得多,使多個查詢,並有選擇(無論是一般還是綿羊)

或者,選擇三隻羊,獲得指數,並選擇七個指標不是所選前三隻綿羊的指標。

+1

謝謝你的第一個建設性的答覆!我同意PHP可能會讓事情變得更容易,但就規模而言,我們只需說動物的桌子上有3000萬行(這些動物喜歡打開它)。 此外,我不能只挑三隻羊,因爲可能會說,數百萬只綿羊都有不同的animal_ids。 – Fishsticks 2012-07-17 04:43:53