2011-03-26 174 views
4

我有3個表:SQL存儲過程

  • tbl_Image從將要獲得的所有圖像的列表
  • user表從該用戶ID將獲得
  • 和圖像的關聯表和成員tbl_MemberAssociation

我的工作流程是用戶可以上傳圖片,並將其存儲到圖片表中。然後,所有用戶都可以查看此圖像,並選擇隨圖像一起提供的三種選擇之一。如果用戶選擇一個選項,它將被添加到關聯表中。沒有用戶可以多次觀看同一張圖片。所以多個條目不會在那裏。

現在我想通過獲取成員列表中選擇相同的選項,並對應爲他們提供了他們的選擇所有常見的圖像不同的選項來找到比賽的%。

I.e.說3個用戶說A,B和C查看tajmahal的圖像。如果A和B選擇了美麗的選擇,而C選擇了「不好」。對於另一個圖像來說,印度國旗A B和C選擇了同樣的致敬。然後對於用戶A:B具有100%匹配(因爲他們兩次都選擇了相同的選項)。對於A:C有兩個相同的50%匹配。

所以這是我的情景,在我所找到的所有匹配對應於當前登錄的用戶。

請幫幫我....我完全不安這個程序。

+2

哪個**數據庫系統**和您使用的是哪個版本?存儲過程代碼通常在供應商之間不是標準化的... – 2011-03-26 11:29:52

+0

我的理解是否正確:您希望存儲過程以兩個用戶ID作爲輸入,並返回這兩個用戶的相同答案的百分比?如果一個用戶提供了答案而另一個用戶沒有提供答案會怎麼樣?這是否算 - 作爲「不同的答案」?或者是跳過該問題(因爲不是兩個用戶都回答了它) – 2011-03-26 11:34:36

+0

我想使用SQL Server 2008 – 2011-03-29 12:19:43

回答

0

我已經對你們的表的實際結構的一些假設,但如果我明白你在找什麼,然後我覺得這個查詢會得到你想要的結果。您可能需要進行一些修改以匹配您的表格結構。

SELECT 
     matches.UserName, 
     CAST(matches.SameRatings AS FLOAT)/CAST(ratings.UserRatingCount AS FLOAT) AS MatchPercent 
    FROM 
     tbl_User 
    CROSS APPLY 
    (
     SELECT 
      COUNT(*) UserRatingCount 
     FROM 
      tbl_MemberAssociation 
     WHERE 
      UserId = tbl_User.UserId 
    ) ratings 
    CROSS APPLY 
    (
     SELECT 
      u1.UserId, 
      u1.UserName, 
      COUNT(*) AS SameRatings 
     FROM 
      tbl_MemberAssociation ma 
     INNER JOIN 
      tbl_MemberAssociation ma1 
     ON 
      ma.ImageId = ma1.ImageId 
     AND ma.Rating = ma1.Rating 
     AND ma.UserId <> ma1.UserId 
     INNER JOIN 
      tbl_User u1 
     ON 
      ma1.userId = u1.UserId 
     WHERE 
      ma.UserId = tbl_User.UserId 
     GROUP BY 
      u1.UserId, 
      u1.UserName 
    ) matches 
    WHERE 
     tbl_User.UserId = @UserId 
    ORDER BY 
     MatchPercent DESC 

@UserId可以作爲輸入傳遞給存儲過程。

首屆CROSS APPLY「收視率」越來越計數爲登錄用戶評級的總數。

第二屆CROSS APPLY「匹配」越來越像數據庫中的其他用戶收視次數的計數。

結果集使用由兩個交叉計算計數應用查詢計算登錄的用戶,誰評價了相同的圖片,登錄的用戶的其他用戶之間的匹配百分比。