2008-11-01 7 views
4

my blog에 페이지 조회수로 가장 인기있는 10 가지 기사를 오른쪽 탐색 메뉴에 표시합니다. 내가하고 싶은 무엇MySQL에서 하루에 페이지 조회수를 계산하는 가장 좋은 방법은

SELECT * 
FROM entries 
WHERE is_published = 1 
ORDER BY hits DESC, created DESC 
LIMIT 10 

하루 페이지의 측면에서 상위 10 명중 을 보여입니다 : 그 얼마나 여기입니다. MySQL을 사용하고 있습니다. 데이터베이스에서이 작업을 수행 할 수있는 방법이 있습니까?

BTW, created 필드는 datetime입니다.

업데이트 : 나는 분명히하지 않았다고 생각합니다. 내가 원하는 것은 1,000 일 전에 게시 된 10,000 개의 히트가있는 블로그 게시물에 대해 1 일 전에 게시 된 10 개의 히트가있는 블로그 게시물과 동일한 인기를 얻는 것입니다.

ORDER BY hits/days since posting 

... hits는 블로그 포스트를 볼 때마다 증가합니다 그냥 int이며 : 의사 코드에서.

OK, 여기 내가 사용하는거야 무슨 :

SELECT *, AVG(
    hits/DATEDIFF(NOW(), created) 
) AS avg_hits 
FROM entries 
WHERE is_published = 1 
GROUP BY id 
ORDER BY avg_hits DESC, hits DESC, created DESC 
LIMIT 10 

감사합니다, 스티븐을! (이 사이트를 좋아합니다 ...)

답변

6

쿼리에서 제안하는 테이블 구조를 사용하여 완전히 확신 할 수 없습니다. 내가 생각할 수있는 유일한 방법은 최고 평균으로 히트 수를 얻는 것입니다. 그렇게함으로써, 쿼리가된다 :

SELECT *, AVG(hits/DATEDIFF(NOW(), created)) as avg_hits 
FROM entries 
WHERE is_published = 1 
GROUP BY id 
ORDER BY avg_hits DESC 
LIMIT 10 

이 쿼리는 생성 된 필드는 DATETIME (또는 유사) 데이터 유형의 가정합니다.

+0

이것은 올바른 생각이지만 avg_hits로 주문 하시겠습니까? –

+0

그래, 나는 지난 5 분 동안 약 5 개의 대답을 했어. 나는 물건을 잊어 버린 채로있는 것 같다 ... –

+0

검색어에 오타가있다, btw. 선택에 다른 닫는 괄호가 필요합니다. –

1

각 조회에서 증가하는 hits_day_count 열과 hits_day_current를 가질 수 있습니다.

각 페이지 뷰에서 hits_day_current 열이 오늘인지 확인합니다. 그렇지 않다면 적중 횟수를 재설정하십시오. 그리고 hits_day_count 열을 증가시키고 hits_day_current를 현재 날짜 시간으로 설정하십시오.

의사 코드 :이와

if article_data['hits_day_current'] == datetime.now(): 
    article_data['hits_day_count'] ++ 
else: 
    article_data['hits_day'] = 0 

article_data['hits_day_current'] = datetime.now() 

명백한 문제는 간단합니다 - 시간대. 서버가있는 곳마다 합계가 00:00에 재설정되므로 유용하지 않을 수 있습니다.

더 좋은 해결책은 총 24 시간의 롤링이 될 것입니다.이 작업을 깔끔하게하는 방법을 잘 모릅니다. 가장 쉬운 방법은 웹 서버 로그를 정기적으로 파싱하는 것입니다. 지난 24 시간 동안의 로그를 가져 와서 각 기사에 대한 요청 수를 계산하고 그 수를 데이터베이스에 저장하십시오.

+0

MySQL과 함께 다른 언어로 가장 잘 수행 할 것을 제안하십시오. 조회수를 나타내는 추가 필드 (hits_day)가 있어야합니다. db에 추가 할 때 먼저 해당 날짜가 오늘인지 확인하십시오. 그렇다면 +1. 그렇지 않은 경우 1로 다시 설정하고 hits_day를 오늘과 동일하게 만듭니다. –

+0

이 접근법을 취하는 유일한 이유는 성능입니다. 나는 야간에 인기를 계산하기 위해 cron job을 실행할 수 있었고, 나는 간단한 SELECT로 돌아왔다. 내 목적을 위해, 그것을 즉시 계산하는 것은 괜찮습니다. –

관련 문제