2016-06-05 2 views
1

나는 2 개의 테이블을 가지고 있습니다.MySQL : 가장 빠른 상승 점수를 가진 항목을 선택/정렬

+----+-------+------+ 
| id | name | user | 
+----+-------+------+ 
| 1 | test | 25 | 
| 2 | foo | 3 | 
| 3 | bar | 12 | 
| 4 | hello | 2 | 
| 5 | world | 6 | 
+----+-------+------+ 

두 번째는 점수를 포함

첫 번째

는 항목/제출이 포함되어 있습니다. 각 점수는 1에서 5 사이의 값을가집니다. 모든 항목에 점수가있는 것은 아닙니다. 내가 어떻게 "빨리"가 상승하고 기반으로 항목을 정렬하기 위해 노력하고있어

+----+-------+-------+------+---------------------+ 
| id | score | entry | user | scored_date   | 
+----+-------+-------+------+---------------------+ 
| 1 | 4 | 1 | 5 | 2016-06-05 10:10:00 | 
| 2 | 3 | 1 | 12 | 2016-06-05 10:20:00 | 
| 3 | 5 | 3 | 6 | 2016-06-05 10:30:00 | 
| 4 | 2 | 2 | 23 | 2016-06-05 10:40:00 | 
| 5 | 3 | 2 | 46 | 2016-06-05 10:50:00 | 
| 6 | 5 | 3 | 14 | 2016-06-05 10:60:00 | 
| 7 | 6 | 3 | 32 | 2016-06-05 11:00:00 | 
| 8 | 5 | 4 | 9 | 2016-06-05 11:10:00 | 
| 9 | 1 | 2 | 4 | 2016-06-05 11:20:00 | 
| 10 | 2 | 4 | 2 | 2016-06-05 11:30:00 | 
| 11 | 4 | 2 | 18 | 2016-06-05 11:40:00 | 
| 12 | 5 | 1 | 8 | 2016-06-05 11:50:00 | 
| 13 | 3 | 2 | 32 | 2016-06-05 12:00:00 | 
| 14 | 4 | 1 | 28 | 2016-06-05 12:10:00 | 
+----+-------+-------+------+---------------------+ 

(표준 날짜 값으로 'DATETIME을'가정). 좋은 예가 threadless.com과 같은 웹 사이트의 "상승"목록입니다. https://www.threadless.com/threadless/designs?status=open&sort=rising

현재 시간 가정 : 12:30:00 예상되는 결과는 "상승"으로 정렬됩니다. 아마도 지난 시간 (11시 30분 0초에서 12시 30분 0초까지)를 기반으로 - 등

Entry table results (Last 1 hour 11:30:00 - 12:30:00) 
+----+-----------+ 
| id | score_sum | 
+----+-----------+ 
| 1 |  9  |  
| 2 |  7  | 
| 4 |  2  | 
| 3 |  0  | 
| 5 |  0  | 
+----+-----------+ 


Entry table results (Last 2 hour 10:30:00 - 12:30:00) 
+----+-----------+ 
| id | score_sum | 
+----+-----------+ 
| 3 | 16  | 
| 2 | 13  | 
| 1 |  9  |  
| 4 |  7  | 
| 5 |  0  | 
+----+-----------+ 

내가 여러 추측하고있어, 2 시간 (12시 30분 0초 10시 30분 0초를) 지속 지난 1 시간 동안 점수가 없거나 지난 3 시간 동안 2 점이 있었지만 과거 5 시간 동안 100 점이 있었기 때문에 시간 프레임이 필요할 수 있습니다. 따라서 지난 1 시간의 결과는 정확하지 않거나 덜 의미가 있습니다.

전제가 주어지면 이러한 SQL 문 뒤에있는 논리를 이해할 수 없습니다. 나는 또한 서로 다른 시간대를 결합하여 어떻게 결과를 명확하고 미성년자로 만들 수 있는지 확신 할 수 없다.

모든 의견을 크게 환영합니다!

답변

2

첫 번째 표는 foo를 호출되고 두 번째 표는 줄 경우 - 다음

솔루션 # 1 :

SELECT foo.id AS id, SUM(COALESCE(bar.score,0)) AS score_sum 
FROM foo 
LEFT JOIN bar 
    ON foo.id = bar.entry 
    AND bar.scored_date >= DATE_SUB(NOW(),INTERVAL 1 HOUR) 
GROUP BY foo.id 
ORDER BY score_sum DESC; 

솔루션 # 2

SELECT foo.id AS id, SUM(COALESCE(bar.score,0)) AS score_sum 
FROM foo 
LEFT JOIN bar 
    ON foo.id = bar.entry 
    AND bar.scored_date >= DATE_SUB(NOW(),INTERVAL 2 HOUR) 
GROUP BY foo.id 
ORDER BY score_sum DESC; 

을 결합하려면 가장 긴 (가장 포괄적 인) 기간을 JOIN 조건으로 사용하십시오. 그런 다음 다른 조건을 열 정의로 사용하십시오. 이 코드 예제를 보여주는 SQLFiddle을 가지고 놀 수 있습니다.

SELECT foo.id AS id 
    , SUM(COALESCE(bar.score,0) * 
      IF(bar.scored_date >= CAST('2016-06-05 11:00:00' AS DATETIME) 
       ,1,0)) AS MereOneHOurInterval 
    , SUM(COALESCE(bar.score,0)) AS BiggestInterval 
FROM foo 
LEFT JOIN bar 
    ON foo.id = bar.entry 
    AND bar.scored_date >= CAST('2016-06-05 10:00:00' AS DATETIME) 
GROUP BY foo.id 
ORDER BY id DESC; 
+0

나는 해결책을 얻지 만, 2 시간짜리에 대해 2 가지 별도의 쿼리가 필요했습니다. 논리적으로 결합하는 방법이 있습니까? 지난 1 시간 동안의 점수가 "체중"이 더 많고, 다음 시간의 점수가 덜한 등등 (최대 6 시간 간격) –

+0

편집을 보았습니다. CAST ('2016-06-05 11:00:00'AS DATETIME)를 DATE_SUB (NOW(), INTERVAL 2 HOURS)로 변경하면 의미가 있습니까? –

+0

@MikeFeng - 나는 그것이 맞는 것 같아요 : 그것은 당신의 비즈니스 규칙입니다. 샘플 데이터에서 찾은 날짜/시간 값을 기반으로 한 기술을 보여주기 위해 상수를 사용해야했습니다. – AgRizzo

관련 문제