2017-05-12 1 views
2

사용자 통계 페이지를 만들고 통계를 올바르게 표시하려고하는데 도움이 필요합니다.MySQL 하위 쿼리/상관 쿼리

나는 등록 된 사용자를 위해 다운로드 할 수있는 파일을 제공하는 웹 사이트를 보유하고 있으며, 다운로드 한 횟수와 각 사용자가 파일을 다운로드 한 횟수 및 다운로드 한 고유 제품 수를 추적하고 싶습니다.

테이블 : customer_statistics

| user | product_id | file_download | date_accessed | 
------------------------------------------------------------ 
| tom | 1104  | mp3  | 2017-05-06 00:00:00 | 
| tom | 1048  | video  | 2017-05-06 00:00:00 | 
| tom | 1048  | video  | 2017-05-06 00:00:00 | 
| tom | 1048  | video  | 2017-05-07 00:00:00 | 
| tom | 1048  | video  | 2017-05-08 00:00:00 | 
| tom | 1010  | video  | 2017-05-08 00:00:00 | 
| tom | 1077  | video  | 2017-05-08 00:00:00 | 
| sue | 1749  | photo  | 2017-05-09 00:00:00 | 
| sue | 1284  | video  | 2017-05-09 00:00:00 | 
| sue | 1284  | video  | 2017-05-09 00:00:00 | 
| sue | 1065  | mp3  | 2017-05-09 00:00:00 | 
| sue | 1344  | video  | 2017-05-10 00:00:00 | 
| sue | 2504  | photo  | 2017-05-10 00:00:00 | 

내가 같은 데이터를 표시하는 것 :

Name | Unique Mp3s | Unique Photos | Unique Videos | Total 
---------------------------------------------------------- 
Tom | 1  | 0   | 3   | 7 
Sue | 1  | 2   | 2   | 6 

unique mp3s/photos/videos 각 파일 유형이 total가 표시 동안에서 다운로드 얼마나 많은 product_id 독특한 보여 해당 특정 사용자에 대해 합산 된 모든 파일 유형 및 발생 총계.

위의 결과를 얻는 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

+0

난 당신이 SELECT COUNT (*), 사용자, GROUP_CONCAT 사용자가 테이블 그룹에서 (file_download의 SEPARATOR 'RARE_WORD')'과 같은 일을 할 수 있다고 생각 '그런 다음 파일 형식에 대해 별도의 (RARE_WORD) 파일을 사용하고 http://php.net/manual/en/function.array-count-values.php를 사용하십시오. 그런 다음 필요에 따라 출력하십시오. – chris85

+0

응용 프로그램 코드의 데이터 표시 문제 처리를 진지하게 고려하십시오. – Strawberry

+0

오, 별칭'count (*) '를'total'로 지정하거나 그냥 제거하고 반복 끝에 합계를 사용하십시오. – chris85

답변

2

나는 이런 식으로 할 것이다는 더 하위 쿼리가 필요하지 :

SELECT user AS `Name`, 
    COUNT(DISTINCT CASE file_download WHEN 'mp3' THEN product_id END) AS `Unique Mp3s` 
    COUNT(DISTINCT CASE file_download WHEN 'photo' THEN product_id END) AS `Unique Photos` 
    COUNT(DISTINCT CASE file_download WHEN 'video' THEN product_id END) AS `Unique Videos` 
    COUNT(DISTINCT product_id) AS `Total` 
FROM customer_statistics 
GROUP BY user;