2010-05-22 250 views
2

我有兩個表如下:複雜的MySQL查詢?

我有一個包含ratingname和一點無論是正面或負面的評價RatingsTable:

 
RatingsTable 
---------------------- 
ratingname ispositive 
---------------------- 
Good  1 
Bad   0 
Fun   1 
Boring  0 

而且我有一個包含對事物的反饋FeedbackTable :人的評級,評級和評分。根據評分表,可以確定反饋是正面評分還是負面評分。

 
FeedbackTable 
--------------------------------- 
username thing  ratingname 
--------------------------------- 
Jim  Chicken  Good 
Jim  Steak  Bad 
Ted  Waterskiing Fun 
Ted  Hiking  Fun 
Nancy  Hiking  Boring 

我想寫以下高效的MySQL查詢:

在一個頁面上,我想顯示的頂部「東西」具有積極的收視率最高的比例。我想確保反饋表中的項目是唯一的......意思是說,如果吉姆評價了雞好20次......它應該只計算一次。在某些時候,我會希望要求爲此頁面計入最低數量的評分(至少10)。我會希望爲最高比例負面評級做同樣的事情,但我相信我可以相應調整正面評分。

+0

FeedbackTable上的PK是什麼? – 2010-05-22 22:38:51

+1

如果吉姆把雞評爲好和壞,應該發生什麼? – 2010-05-22 22:49:02

+0

我改進了問題的格式,並在表中添加了一些列名。如果您想使用我建議的不同列名,請隨時修復它。 – 2010-05-22 23:06:53

回答

7

獲得「事」的良好收視率的比例,以便您可以使用此查詢:

SELECT thing, SUM(ispositive)/COUNT(*) AS proportion_positive 
FROM (SELECT DISTINCT username, thing, ratingname FROM FeedbackTable) T1 
JOIN RatingsTable T2 
ON T1.ratingname = T2.ratingname 
GROUP BY thing 
ORDER BY proportion_positive DESC 

爲了您的數據。例如它返回:

 
thing  proportion_positive 
Chicken  1.0000 
Waterskiing 1.0000 
Hiking  0.5000 
Steak  0.0000 

至少需要10在顯示結果之前投票添加此行GROUP BY

HAVING COUNT(*) >= 10 

獲得負面評級變化SUM(ispositive)SUM(NOT ispositive)的比例。

注意:最好爲您的投票表添加唯一約束,而不是僅選擇disctinct值。

+0

謝謝!!!!這工作完美。現在只有這個解決方案的挑戰是排名負面反饋。負反饋爲0,因此除以計數值不會返回正確的比例。 – Scott 2010-05-22 23:32:35

+0

@Scott:試試'SUM(NOT ispositive)'。 – 2010-05-22 23:38:42

1
SELECT * 
FROM `feedback` 
LEFT JOIN `ratings` ON `feedback`.`rating` = `rating`.`label` 
ORDER BY `rating`.`value` DESC 
GROUP BY `feedback`.`username` 
LIMIT 10 

摘要:通過用戶名加入該評級您的反饋表,但組,這樣你只能得到每一個結果的用戶名。

+0

完全沒有問題要求。每種食物的最高正比率。這將涉及某種好評和差評。 – 2010-05-22 22:46:19

+0

那麼,最後的SUM沒有被要求。似乎只有一個高票的事情被要求列出(引用:「我想顯示最高的'事情'」)。正如其他答案所示,您可以使用SUM將子查詢附加到最終結果 - 優雅地寫入Mark! – 2010-05-22 22:52:12

+1

但是,如果雞有100票和800票,你需要考慮到這一點! – 2010-05-22 22:54:47