2012-07-17 2 views
-5

나는 상당히 예의 바르고 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 
+0

거의 손에 닿지 않았다. 미안 내가 도움이되는 코멘트를 삭제했다면 - 스레드에서 건설적인 것을 만들 때 너무 많은 소음이 들렸습니다. – BoltClock

답변

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 | 

3이 3 개의 양을 가지고 있어도 결과는 2입니다. ey은 지난 10 년이 아니었다.

0

당신이 (여기에 태그) PHP를 사용하고 있다고 가정하면, 대신에 하나 개의 쿼리를 만들고, 그것은 몇 가지 질의를하고 중 (선택을 가지고 많은 간단합니다 일반 또는 양)

또는 양을 세 개 선택하고 색인을 얻은 다음 색인이 선택 된 처음 세 양의 색인이 아닌 곳에 7 개를 선택하십시오.

+1

최초의 건설적인 답변에 감사드립니다! 나는 PHP가 일을 더 쉽게 만들 수 있다는 것에 동의하지만, 크기면에서 Animal의 테이블에는 3 천만 개의 행이있다. 또 다른 animal_ids가있는 양 수백만 마리가있을 수 있기 때문에 나는 양 3 마리를 선택할 수 없습니다. – Fishsticks

관련 문제