2011-09-06 67 views
0

我有這樣的疑問,計數taht匹配網站= $網站的所有行:MySQL查詢計數並檢查匹配嗎?

$count= mysql_query("SELECT COUNT(DISTINCT `Site`) FROM `Ratings` WHERE `Site` = '$site'"); 

上述查詢得到的評分數量爲$網站。但是我也需要知道用戶是否已經對網站進行了評分。我使用的是用於此另算:

SELECT COUNT(*) FROM `Ratings` WHERE `Site` = '$site' AND `UID` = '$uid'" 

是否有可能獲得現場比賽的數量,並檢查用戶評爲該網站在一個查詢?謝謝

回答

0

是的,這不是很直接,但你可以在一個查詢中做到這一點。試試這個:

SELECT COUNT(*) as 'num_ratings', IF(`UID` = '$uid','YES','NO') as 'already_rated' FROM `Ratings` WHERE `Site` = '$site' ORDER BY already_rated DESC 

這個查詢會返回1行2列。第一列num_ratings將是該特定網站的評分數量,並且already_rated會告訴您該特定用戶是否對該網站進行了評分。 (它會是'是'或'否')

ORDER BY already_rated DESC確保如果用戶對網站進行了評分,它將返回YES,因爲YES在字母表後面出現NO。這是必要的,因爲當你使用COUNT()時,行被分組在一起。

編輯:進一步測試後,上述解決方案將無法正常工作。改用這個。

SELECT COUNT(*) as 'num_ratings' IF(GROUP_CONCAT(IF(`UID` = '$uid', 'YES','NO') SEPARATOR ',') LIKE '%yes%', 'YES','NO') as 'already_rated' FROM `Ratings` WHERE `Site` = '$site' 
+0

如果確實有可能在MySQL中「對飛」 GROUP BY值在選擇列表中,因爲你是在這種情況下,與是/否列暗示,那麼你的查詢將返回2行,如果用戶評分,則計數將會減1。如果無法做到這一點,將會產生錯誤。如何將一個聚合函數與一個查詢中的單個行的評估結合起來? – cdonner

+0

@cdonner如果省略GROUP BY子句,則相當於按所有行進行分組。 (直接從這個[mysql doc](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html)。 我在我自己的表中的一個表上測試了我的查詢,並且它返回一行兩列,如上所述 –

+0

@ cdonner7我只是在SELECT子句中添加了一些東西,所以它根本不會影響計數 –

0

我只有MySQL的膚淺知識,我看到它做某些事情比其他DBMSs(有時更好)有所不同,但我仍然認爲你不計算每個網站與您的查詢評級,而是數量您的評分表中的「獨特」網站,如果受到「網站」參數的限制,該網站始終爲1。 你需要一個GROUP BY,以便通過網站來算等級,如:

SELECT 
    count(*) 
FROM `Ratings` 
WHERE `Site` = '$site' 
GROUP BY `Site` 

您有包括檢查,如果用戶評爲網站不同的選擇。一個是相關的子查詢,它爲您提供結果集中每個站點的信息。

SELECT 
    count(*), 
    (SELECT count(*) from `Ratings` where `Site` = r.`Site` and `UID` = '$uid') 
     as has_rated 
FROM `Ratings` r 
WHERE `Site` = '$site' 
GROUP BY `Site` 

另一個辦法是自連接 - 這通常有性能上的優勢,在一個子查詢(子查詢有結果集中的每一行進行評估和連接沒有)。但是,由於您正在限制網站的查詢,並且總是期望結果集中只有一行,所以它們幾乎沒有什麼區別。