难道的mysql查询取决于以前的查询结果 - 可能吗?

时间:2011-04-17 08:37:27

标签: 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个
史蒂文 - > 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!");

但到目前为止它不起作用,die函数被调用。我花了几个小时试图详细了解查询,但我没有。^^ 我理解连接两个表的概念,但我不明白MAX(ranking.points)的排名是什么。 我很抱歉,如果这有点愚蠢,但我真的写了我的第一个回声“你好”; 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")

但是第二个查询会在该日期之前为我提供所有行。有没有办法将它限制为每个ranking.name只有一行?

谢谢!

2 个答案:

答案 0 :(得分: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|

答案 1 :(得分: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

(将INTERVAL X DAY中的X替换为最新查询条目之前的天数。)

outrank派生表列出了那些超过当前行X或更早几天的行。通过将其与每个用户的最新排名相结合,我们可以看到哪些其他用户在X天或更多天之前获得了相同或更高的分数。当没有条目超过当前条目时,outrank。*字段将为NULL。