2014-10-17 6 views
1

데이터베이스 구조는 다음과 같습니다.MySQL 그룹화 두 번

ip | yid | 날짜

여기에서 ip은 사용자의 IP를 나타내고 yid은 특정 페이지 ID입니다. 아래에서 수행 한 ipyid 열을 기준으로 그룹화하려고합니다. 하지만 그 결과를 yid으로 그룹화해야합니다. 그래서 그룹화 할 것입니다 :

yid | count

여기서 count는 페이지가 IP 주소 당 1 통화 제한으로 호출 된 횟수입니다.

SELECT `ip`, `yid`, `time`, MAX(`time`), count(*) 
FROM mp_downloads 
GROUP BY CONCAT(`ip`, `yid`), `yid` 
ORDER BY count(*) DESC 

을하지만 그것은 별개의 yid & ip 콤보하여 그룹 후 페이지 ID를 그룹화 아니에요 :

는 지금은 있습니다.

답변

1

이 사용하는 중첩 된 쿼리를보십시오 :

select temp.*, count(*) from 
(SELECT `ip`, `yid`, `time`, MAX(`time`) 
FROM mp_downloads 
GROUP BY CONCAT(`ip`, `yid`))temp group by temp.yid; 
+0

이 작동하지만'ORDER BY count (*) DESC'를 제거해야했습니다. – user1345650

0

에 액세스 한 IP 주소의 수를 얻기위한 규범적인 패턴 (yid)은 다음과 같습니다 최상의 성능을 위해

SELECT d.yid 
    , COUNT(DISTINCT d.ip) AS ip_count 
    , MAX(d.date)   AS latest_time 
FROM mp_downloads d 
GROUP BY d.yid 

, 당신은 적당한 색인을 원할 것입니다.

... ON mp_downloads (yid, ip, date) 

두 개의 열을 연결하는 표현식을 그룹화 할 필요는 없습니다. 파생 테이블 (인라인 뷰)이나 하위 쿼리가 필요 없습니다. latest_time이 필요하지 않은 경우 해당 표현식을 생략 할 수 있습니다.

+0

이 쿼리에서'latest_time'의 평균을 얻는 방법이 있을까요? – user1345650

+0

각'(yid, ip)'에 대해 "최신"시간을 원하는 다음 해당 값을 "평균"하려면 (SELECT 목록 또는 인라인보기에서 하위 쿼리가 필요합니다) 또는 주문 및 사용자 정의 변수가 포함 된 트릭입니다. 그리고 평균을 계산하는 식은'date' 열의 데이터 유형에 따라 달라질 것입니다. (이 요구 사항이 사양의 일부인 경우 대답에 주석으로 남겨 두지 말고 질문에 포함해야합니다.) – spencer7593

+0

다른 솔루션을 사용하면 단순히 AVG (시간) 질문. 나는 당신의 대답을 통해 그것을 할 수있는 간단한 방법이 있는지를 알고 싶었다. – user1345650

관련 문제