2012-10-16 182 views
2

這是我正在做的。我有一個包含重複行的用戶評估表。我只想爲每個用戶獲取DISTINCT值。MySQL SELECT Multiple DISTINCT COUNT

在下表中的示例中。如果只有user_id 1和50屬於特定位置,則只有每個用戶唯一的video_id應該作爲COUNT返回。用戶1傳遞了視頻1,2和1.所以這應該只有2條記錄,並且用戶50傳遞了視頻2.所以這個位置的總數是3.我認爲我需要在查詢中有兩個DISTINCT's,但是不知道如何做到這一點。

+-----+----------+----------+ 
| id | video_id | user_id | 
+-----+----------+----------+ 
| 1 |  1 |  1 | 
| 2 |  2 |  50 | 
| 3 |  1 |  115 | 
| 4 |  2 |  25 | 
| 5 |  2 |  1 | 
| 6 |  6 |  98 | 
| 7 |  1 |  1 | 
+-----+----------+----------+ 

這就是我目前的查詢的樣子。

$stmt2 = $dbConn->prepare("SELECT COUNT(DISTINCT user_assessment.id) 
FROM user_assessment 
LEFT JOIN user ON user_assessment.user_id = user.id 
WHERE user.location = '$location'"); 
$stmt2->execute(); 
$stmt2->bind_result($video_count); 
$stmt2->fetch(); 
$stmt2->close(); 

所以我的查詢返回的所有計數的指定位置的,但它不會忽略從每個特定用戶非唯一結果。

希望這是有道理的,謝謝你的幫助。

+0

沒有解決方案,但優化:使用INNER JOIN。它比LEFT JOIN更快,並且效果相同,因爲您使用WHERE子句中的連接表。 – GolezTrol

+0

您是否知道SQL查詢中允許換行符? – GolezTrol

+0

@GolezTrol,是的,謝謝。這就是我如何複製丟失換行符的代碼。我編輯了我的帖子,使其更容易閱讀。 – Jako

回答

1

下面的查詢將加入一個子查詢,該查詢爲每個用戶提取不同的視頻。然後,主要查詢會對這些數字進行求和,以獲取該位置的視頻總數。

SELECT 
    SUM(video_count) 
FROM 
    user u 
    INNER JOIN 
    (SELECT 
     ua.user_id, 
     COUNT(DISTINCT video_id) as video_count 
    FROM 
     user_assessment ua 
    GROUP BY 
     ua.user_id) uav on uav.user_id = u.user_id 
WHERE 
    u.location = '$location' 

注意,既然你已經使用綁定,您也可以通過$location在綁定參數。我把這個留給你,因爲它不是問題的一部分。 ;-)

+0

你先生是一個天才,它完美的工作。十分感謝你的幫助! – Jako

6
SELECT COUNT(DISTINCT ua.video_id, ua.user_id) 
FROM user_assessment ua 
INNER JOIN user ON ua.user_id = user.id 
WHERE user.location = '$location' 

你可以寫很多東西COUNT裏面,所以不要猶豫,把你到底要什麼在它。這將給出不同夫婦(video_id, user_id)的數量,如果我理解正確,這就是你想要的。

+0

謝謝你的幫助,這個查詢也對我很好。 – Jako

+2

+1我不確定,也沒有手頭的數據庫進行測試,但如果這樣的話,這比我的回答好。更緊湊,更清晰,可能更快。 – GolezTrol