2016-10-04 62 views
0

自从两天以来,我一直困扰着一个问题,我需要帮助。按顺序检索值,并使用mySQL减去行数

我想对SQL表中的连续行进行减法,但通过对值进行排序。

比如我有我的表像这样:

Name  | Activity | Day 
John | Tennis | Day10 
Bob | Swimming | Day9 
Mathilda | Tennis | Day2 
John | Swimming | Day2 
Bob | Tennis | Day2 
John | Computer Science | Day 10 

在这个表,我想知道谁得到一个以上的活动是什么两项活动之间的时间的人。

因此,在这个例子中,如果我们可以减少天数,我们会看到约翰和鲍勃有两个活动,约翰用8天时间来达到他们的最大休息时间。

我试图做到这一点,像这样:

SET @previousDay:=0; 

SELECT Name, days, @previousDay - day, @previousDay:=day 
FROM table 
WHERE Name IN (SELECT Name FROM table group by Name having count(Name) > 1) 
ORDER BY Name, Day 

但随着ORDER BY是减法后做是完全错误的。我没有看到好的结果,因为我想对排序的天数进行连续的减法运算。

看来我不能对IN结果进行排序,所以你知道是否有办法解决我的问题吗?

非常感谢您的帮助!

顺便说一句:我不知道如何正确格式表,所以任何帮助,将不胜感激,非常感谢!

回答

0

你可以这样做:

select t.*, (previousDay - day) as diff 
from (select t.*, 
      (@pd := (case when @n <> name 
          then if(@n := name, NULL, NULL) -- does happen 
          when (@tmp_pd := @pd) = null then null  -- never happens 
          when (@pd := day) = null then null -- never happens 
          else @tmp_pd 
         end) 
      ) as previousDay 
     from t cross join 
      (select @n := '', @pd = -1) params 
     order by name, day 
    ) t 
where previousDay is not null; 

注意,这个经历了很大的努力把所有的操作上的变量,在一个表达式(因此在case条件怪异= NULL)。原因是MysQL不保证select子句中表达式的评估顺序,因此可能会按错误的顺序评估多个分配。

+0

非常感谢您的帮助和评论,这真的很有帮助。 Unfornately我只得到空值,因为我的桌上的@n <>名称条件,我不知道为什么。 我试图在选择查询中将值名分配给@n,但它不会改变任何内容。 我将尽力解决这个问题。 非常感谢您的回答我通过查看您的代码了解了很多。 – Mike

+0

@Mike。 。 。我留下了一些东西。 –