2011-04-17 56 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。