查询多个列和日期

时间:2012-12-31 18:06:03

标签: mysql

我的表中有4 columns(date,gr1,gr2,gr3)(gr)列,其等级范围为(a到f)。

date        gr1 gr2 gr3
2012-1-1    a   b   c
2011-11-31  b   d   c
2011-11-30  c   a   f
2011-11-29  a   b   f
2011-11-28  f   b   c
2011-11-27  a   c   d
2011-11-26  c   a   b

我需要查询以下内容: 我需要选择当任何列值在第二天具有'a'后跟'f'成绩时,无论哪个列具有等级。

我是新手,非常感谢任何帮助......祝大家新年快乐!

1 个答案:

答案 0 :(得分:1)

进行比较时,一种方法是将记录一起比较到同一行。由于您要比较“当前日期与当天日期”中的记录,因此您可以将表格加入到自身中,并且日期相差一天。这是通过DATEDIFF函数完成的,该函数计算两个日期之间的天数。

查询1

select
  today.*,
  followingday.date as ndate, followingday.gr1 as ngr1,
  followingday.gr2 as ngr2, followingday.gr3 as ngr3
from mytable today
join mytable followingday on DATEDIFF(followingday.date, today.date) = 1

这将给出以下结果,连续日值与前一天相结合(我已使用前缀followingday重命名n中的列,以便所有列都具有唯一名称,否则它们不会全部显示在结果集中):

结果(DEMO

|                            DATE | GR1 | GR2 | GR3 |                           NDATE | NGR1 | NGR2 | NGR3 |
------------------------------------------------------------------------------------------------------------
| November, 30 2011 00:00:00+0000 |   c |   a |   f | December, 01 2011 00:00:00+0000 |    b |    d |    c |
| November, 29 2011 00:00:00+0000 |   a |   b |   f | November, 30 2011 00:00:00+0000 |    c |    a |    f |
| November, 28 2011 00:00:00+0000 |   f |   b |   c | November, 29 2011 00:00:00+0000 |    a |    b |    f |
| November, 27 2011 00:00:00+0000 |   a |   c |   d | November, 28 2011 00:00:00+0000 |    f |    b |    c |
| November, 26 2011 00:00:00+0000 |   c |   a |   b | November, 27 2011 00:00:00+0000 |    a |    c |    d |

现在结果合并为一行,我们可以对数据应用一些逻辑。在这种情况下,规则是“任何列值在第二天都有'a'后跟'f'等级,无论哪个列都有等级。”因此,当天任何成绩均为a,其次是第二天f成绩为... where (today.gr1 = 'a' or today.gr2 = 'a' or today.gr3 = 'a') and (followingday.gr1 = 'f' or followingday.gr2 = 'f' or followingday.gr3 = 'f')

查询2

|                            DATE | GR1 | GR2 | GR3 |                           NDATE | NGR1 | NGR2 | NGR3 |
------------------------------------------------------------------------------------------------------------
| November, 29 2011 00:00:00+0000 |   a |   b |   f | November, 30 2011 00:00:00+0000 |    c |    a |    f |
| November, 27 2011 00:00:00+0000 |   a |   c |   d | November, 28 2011 00:00:00+0000 |    f |    b |    c |

结果(DEMO

a

结果显示11-27-11上的成绩为f,其后11-28-11成绩为a。同样,11-29-11上的成绩为f11-30-11上的成绩为{{1}}。这些应该是满足规则的唯一结果。

相关问题