2012-05-17 82 views
2

我在我的網站上有一個積分系統,並且可以獲得不同網站類別中不同成就的積分。類別可以使用具有「links_to」和「links_from」字段的「category_relations」表格的子類別和父級類別,並具有相關的category_id。計算當前類別或下面類別中得分最高的前5名用戶

我想要做的是獲取當前類別中最高分的前5位用戶及其下方的任何類別。

我「points_awarded」表中有哪些用戶從哪些類別的授予任何點和所有記錄:

USER_ID,
points_amount, 加(TINYINT布爾如果它的點添加或不),
minus(tinyint布爾值,如果是點罰分或不),
category_id

我真的不知道從哪裏開始。我需要兩個查詢,一個是獲取所有子類別ID,然後是一個使用它來運行另一個查詢來獲取所用點的SUM()?是否有可能在一個查詢中完成?

+1

讓我看看您正在嘗試的代碼.... –

+0

什麼是類別? – Norse

+1

你是約翰威廉姆斯的着名作曲家還是另一個? – Okonomiyaki3000

回答

2

我需要你的數據庫表的詳細信息,以確保,但這樣的事情可能會工作:

SELECT 
    `user_id`, 
    SUM(IF(`plus`, `points_amount`, 0)) - SUM(IF(`minus`, `points_amount`, 0)) AS `points` 
FROM 
    `points_awarded` 
WHERE 
    `user_id` = $user_id 
    AND (
     `category_id` = $cat_id 
     OR `category_id` IN(
      SELECT `links_to` 
      FROM `category_relations` 
      WHERE `links_from` = $cat_id 
     ) 
    ) 
GROUP BY `user_id` 

我很好奇,不過,爲什麼你還要加場和負場?如果plus是假的,我們不能假設它是負的嗎?爲什麼無論如何都有這個領域,爲什麼不只是把points_amount作爲一個簽名領域呢?

+0

謝謝,我現在就給它一個去。我注意到,當我打字時,我並不需要這兩個字段,所以這將改變。這兩個字段的原因,而不是隻有'points_amount'是我想向用戶顯示他們以前的加分記錄。所以,而不是有加/減和點金額,我只是運行一個查詢來計算這個,當我需要......總是爲更好的建議,但。 :) – john

+1

假設您只有一個有符號字段的點,並且根本沒有加號或減號字段,您可以執行如下查詢:SELECT SUM(IF(points_amount> 0,points_amount,0))AS points_awarded,SUM(IF points_amount <0,points_amount,0))AS points_subtracted'這將得到相同的信息與簡單的表結構。 – Okonomiyaki3000