2011-04-17 57 views
1

我幾乎是一個noob,試圖通過搜索來解決這個問題,但我沒有成功。根據以前的查詢結果難以查詢mysql - 可能嗎?

我有一個MySQL表是這樣的:
保羅 - > 2011-04-01 - > 100
史蒂芬 - > 2011-03-01 - > 100
鮑勃 - > 2011-04-01 - > 150

保羅 - > 2011-04-02 - > 150
史蒂芬 - > 2011-03-02 - > 200
鮑勃 - > 2011-04-01 - > 150

保羅 - > 2011 -04-03 - > 200
Steven - > 2011-03-03 - > 300

所以基本上我有一些名稱與日期和分數。日期之間可能存在差距,這意味着保羅可能對昨天有價值,但史蒂文可能不會。 我想執行一個查詢,在這個查詢中,我可以找到在最後一次輸入後的一定天數內沒有獲得任何積分的所有人的姓名。
我開始的東西是這樣的:
$ query =(「SELECT name,MAX(id)FROM ranking GROUP BY name」):
這將確保我有每個人的最後實際分數值,但在此查詢我需要執行一個查詢,該查詢現在可以查找其最近的條目等於或大於最新得分值的X分數值或超過X天的分數值的人員。
我希望這是可以理解的。

之前我通過查詢整個表格並在PHP中進行比較來完成所有這些工作。但是這個表現在有將近10,000個條目,這些條目創建的數組超出了內存限制。

是否有可能做出這樣的特定查詢或者是否有人知道該問題的另一個解決方案? 在此先感謝您的幫助。

@mdma 嗨再次,

你的假設是正確的。每行保存某個日期的名稱分數。分數可以增加,減少或保持不變。由於我只給500人得分最高,有人可能有4月1日的價值,但如果他退出前500名,他的價值可能不會在4月2日。但他可能會在4月10日再次獲得獎金,前500個最高分。

我試圖實現查詢方式如下:(我換成分的成績,因爲這是該領域是如何被調用)

$query = "SELECT ranking.name, MAX(ranking.id) rankingId, MAX(ranking.points) rankingPoints, MAX(ranking.date) rankingDate, outrank.name, MAX(outranking.id) outrankId, MAX(outrank.points) outrankPoints, MAX(outrank.date) outrankDate " . 
    "FROM ranking " . 
     "LEFT JOIN " . 
       "(SELECT name, id, points, date FROM ranking GROUP BY name) AS outrank " . 
     "ON " . 
       "(ranking.name!=outrank.name " . 
       "AND outrank.date<=DATE_SUB(ranking.date, INTERVAL 3 DAY) " . 
       "AND outrank.points>=ranking.points) " . 
     "GROUP BY ranking.name, outrank.name"; 
$result = mysql_query($query) or die("You wish, sweetheart!"); 

但它不工作,到目前爲止,模具函數被調用。我花了幾個小時試圖詳細瞭解查詢,但我沒有。^^ 我理解加入兩個表的概念,但我不明白MAX(ranking.points)rankingPoints的作用。 對不起,如果這有點愚蠢,但我真的寫了我的第一個回聲「你好」; 4周前。

再次感謝您!

嗨,再一次

我有點做了我自己的工作。我會詢問每個人的最新統計數據與

$query = "SELECT rank.id, rank.name, rank.points, rank.niveau, rank.date
FROM (SELECT name, MAX(date) AS maxdate FROM ranking GROUP BY name) AS x
INNER JOIN ranking AS rank ON rank.name = x.name AND rank.date = x.maxdate
WHERE niveau != '---' ORDER BY name";

後來我做這讓我所有的結果與日期前X天的第二查詢。

$query = sprintf("SELECT rank.name, rank.date, rank.points, rank.id
FROM (SELECT name, MAX(date) AS maxdate FROM ranking GROUP BY name) AS x
INNER JOIN ranking AS rank ON rank.name = x.name AND rank.date <= date_sub(x.maxdate, INTERVAL '%s' DAY)
WHERE niveau != '---' ORDER BY name, date DESC")

但第二個查詢會給我所有行的該日期之前的人。有沒有辦法將其限制爲每個排名。名稱只有一行?

謝謝!

回答

0

更好寫,讓你最後日期和時間之間的差距最後日期 之前,像這樣

CREATE FUNCTION GET_GAP (name VARCHAR) 
    RETURNS INT 
    DETERMINISTIC 
    BEGIN 
    DECLARE id,gap INT; 
    DECLARE d DATE; 
    select max(id) as id, max(date) as date into id,d from A where A.name = name; 
    select max(date)-d into gap from A where A.id != id and A.name = name; 
    RETURN gap; 
    END| 
+0

我想這是一個MySQL函數。我不知道我該如何使用它,以及我如何使用它。 – 2011-04-19 16:26:45

0

套用一個功能,因爲每個人的最新成績,查找所有其他人誰了得分大於或等於X或更多天前。

我假設排名是「當前運行」或累計,以便每行顯示該人在給定日期的當前得分。這樣做的結果是用戶的分數和日期保持不變或者隨ID增加。這是我的假設,讓我知道如果它不正確。

SELECT ranking.name, MAX(ranking.id) rankingId, MAX(ranking.score) rankingScore, MAX(ranking.date) rankingDate, outrank.name, MAX(outranking.id) outrankId, MAX(outrank.score) outrankScore, MAX(outrank.date) outrankDate 
FROM ranking 
    LEFT JOIN 
     (SELECT name, id, score, date FROM ranking GROUP BY name) AS outrank 
    ON 
     (ranking.name!=outrank.name 
     AND outrank.date<=DATE_SUB(ranking.date, INTERVAL X DAY) 
     AND outrank.score>=ranking.score) 
GROUP BY ranking.name, outrank.name 

(區間X日X替換成與天數的最新條目查詢之前。)

outrank派生表列出了那些早期多天地位高於當前行X或行。通過將其與每位用戶的最新排名結合起來,我們可以看到哪些其他用戶在X天或更多天前獲得了相同或更高的分數。如果沒有超出當前條目的條目,則超出。*字段將爲NULL。

相關問題