2014-01-11 3 views
1

24 시간 동안 가장 많이 본 페이지를 검색하고 싶지만 페이지 (게시물)와 조회수 사이에 1 대 1의 관계를 만들지 않았습니다. 지난 24 시간 동안 가장 많이 본 사람

articles table

id | title | content | created | view_count 
-----+-----------+---------+------------+------------ 
    1 | title-1 | info-1 | 1386478352 | 2 
    2 | title-2 | info-2 | 1386532855 | 90 
    3 | title-3 | info-3 | 1386637325 | 25 
    4 | title-4 | info-4 | 1386812249 | 5 
    5 | title-5 | info-5 | 1387094028 | 10 

는 내가 가장 모든 시간의 볼을 검색하려면 다음을 사용하고 있습니다,하지만 난이 매 24 시간을 재설정해야합니다.

SELECT * FROM articles ORDER BY view_count DESC

나는이 대신 문서 페이지가 요청 된 시간에 볼 때마다 기사 사이에 1 일에 관계 뷰 수를 생성 및 저장을 위해 INFORMATION_SCHEMA를 사용할 수있는 방법이 있나요?

+0

아주 좋은 지적입니다. 감사합니다. – iBrazilian2

+0

@ MarkusMalkusch : 그렇다면 무엇을 권하고 싶습니까? 기사에 대한 외래 키와 타임 스탬프가있는 모든보기에 대한 레코드? – Aquillo

답변

2

기본 DBS의 구현 세부 사항을 사용하지 않는 것이 좋습니다. 마이그레이션/업데이트로 어려움을 겪을 것입니다.

그건 간단한 1 : n 관계 Pageview (articleId, viewdate)를 제안했습니다. 각 사용자보기는 페이지 뷰에 타임 스탬프를 추가합니다. 그런 다음 해당 정보를 사용하여 원하는 항목을 쉽게 결합하고 집계 할 수 있습니다.

SELECT articles.*, COUNT(*) views24h 
    FROM articles 
    LEFT JOIN pageview ON pageview.articleId = articles.Id 
       AND pageview.viewdate > SUBDATE(NOW(),1) 
    GROUP BY article.id 
    ORDER BY views24h DESC 
    LIMIT 10; 
+0

나는 이것을 실현하는 가장 효율적인 방법 인 것처럼 보였습니다. 도와 줘서 고마워. – iBrazilian2

1

데이터베이스 모델을 변경해야합니다.

예를 들어 datearticle_id 열로 이름이 지정된 테이블을 만듭니다.

그런 다음 모든보기마다 새 행을 삽입하십시오. 마찬가지로 :

SELECT count(*) FROM views WHERE article_id = 1 AND date > UNIX_TIMESTAMP() - 86400 

이 마지막 24 시간에 1 하나를 사용하여 문서의 모든 방문을 반환 :

INSERT INTO views (date, article_id) VALUES (UNIX_TIMESTAMP(),1) 

이제 지난 24 시간 내에 뷰를 반환과 같은 쿼리를 만들 수 있습니다.

+0

@ssedano 아직도 24 시간은 보이지 않습니다. 0055에서 0055을보고 0100에서 지우면 10 분 전에 보았을지라도 그 수는 0105에서 0으로 표시됩니다. – Aquillo

+0

네 말이 맞아, 나는 너무 빨리 썼다. 감사합니다 – ssedano

관련 문제