2013-12-10 46 views
0

我試圖得到一個表「加權得分」用一個公式是我設計的每個類型下面的模式返回:如何從sql查詢中獲取每種類型的「分數」列表?

最愛:用戶ID,drinkName

歷史:用戶ID,drinkName

飲:名稱,方向,類型

飲酒:IDNUM,用戶ID,密碼

讓歷史上每次喝值得0.666分和喜愛價值1 POI每次喝NT。

因此,每次可以說一個喝伏特加的飲料在歷史上出現0.666應該被添加到分子爲一個特定的用戶ID。並且爲伏特加總共收藏1分。 然後它應該除以用戶ID在收藏夾和歷史記錄中的總喝酒數量。

因此,舉例來說,我在歷史3個伏特加酒和收藏2,它應該是: (3(0.666)+2)/ 5

和查詢應該返回這對於所有的「類型」我有可用的最好的飲料。

我現在有這個疑問:

SELECT (
(SELECT COUNT(*) 
    FROM Drink D JOIN History H ON H.drinkName = D.name 
    WHERE type = 'vodka' AND userID = 'sai') 
+ 
(((SELECT COUNT(*) 
    FROM Drink D JOIN Favorite F ON F.drinkName = D.name 
    WHERE type = 'vodka' AND userID = 'sai'))*0.666)) 
/ 
((SELECT COUNT(*) FROM History WHERE userID = 'sai') 
+ 
(SELECT COUNT(*) FROM Favorite WHERE userID = 'sai')) 

然而,對於每一個類型的飲料的特定類型的飲料,但不表這隻回報。

+0

您標記MySQL和SQL服務器...哪個是真的? – dazedandconfused

+0

對不起,這是偶然的,它唯一的mysql – user2981811

+0

考慮提供適當的DDL(和/或一個sqlfiddle)與期望的結果集 – Strawberry

回答

1

使用GROUP BY以及聚合函數來獲得每類總數。

SELECT type, SUM(numerator)/SUM(denominator) score 
FROM (
    SELECT type, COUNT(*) numerator, COUNT(*) denominator 
    FROM History 
    WHERE userID = "sai" 
    GROUP BY type 
    UNION ALL 
    SELECT type, (COUNT(*) * 0.666) numerator, COUNT(*) denominator 
    FROM Favorites 
    WHERE userID = "sai" 
    GROUP BY type 
) u 
GROUP BY type 
0

我認爲你有一點模式問題。根據用戶是否將其標記爲最喜歡的,似乎沒有必要在兩張不同的表中追蹤飲品歷史記錄。我認爲飲料的歷史應該追蹤所有的飲料,不管它們是否是最喜歡的飲料,而最喜歡的應該只是指出當前已經標記爲喜歡的飲料。

所以,把你的5飲料例如較早,我會說你的表可能看起來像:

歷史

userId drinkName someTimeField 
sai vodka  2013-12-09 12:30:53 
sai tequila 2013-12-09 12:31:23 
sai rum  2013-12-09 12:31:53 
sai vodka  2013-12-09 12:32:23 
sai beer  2013-12-09 12:32:53 

所以旁邊明知賽可能有酗酒的問題(因爲你知道,當他有他的飲料)你不管他dranks什麼作爲飲料是否是「收藏夾」

喜歡全histroy

userId drinkNane 
sai  vodka 
sai  everclear 

現在你只需做單容易加入,讓您的計算:

SELECT 
    SUM(CASE WHEN f.drinkName IS NOT NULL THEN 1 ELSE 0.66 END CASE) 
    /SUM(1) AS `value` 
FROM drinker AS d 
LEFT JOIN history AS h 
    ON d.userId = h.userId 
LEFT JOIN favorite AS f 
    ON h.userId = f.userId AND h.drinkName = f.drinkName 
WHERE d.drinker = ? 
GROUP BY d.drinker 
相關問題