检索缺少的列值

时间:2015-12-10 18:15:59

标签: mysql sql highcharts

我想在Yii2中使用 Highcharts 绘制图表。我有一个 student_detail 表,其中包含 year,height,province_id 和另一个表。

我希望每年检索所有省份的平均高度的行。我想在student_detail表中没有一年的行时获得零值。

static struct sigaction sa, old;
static jmp_buf env;

static void myalarm(int sig)
{
  printf("alarm!\n");
  siglongjmp(env,1);
}

int execution_time_limit( void (*fun)(void *), void *parameter, int period)
{
  sa.sa_handler = myalarm;
  sa.sa_flags = 0; 
  sigemptyset(&sa.sa_mask);
  sigaction(SIGALRM, &sa, &old);

  alarm(period);
  if(sigsetjmp(env,1) == 0) {
    fun(parameter);
    sigaction(SIGALRM, &old, NULL);
  }
  else
    return 0;
 return 1;
}

返回:

static struct sigaction sa, old;
static jmp_buf env;
int ret = 0;

static void myalarm(int sig)
{
  printf("alarm!\n");
  ret = 1;
}

int execution_time_limit( void (*fun)(void *), void *parameter, int period)
{
  sa.sa_handler = myalarm;
  sa.sa_flags = 0; 
  sigemptyset(&sa.sa_mask);
  sigaction(SIGALRM, &sa, &old);

  alarm(period);
  fun(parameter);
  sigaction(SIGALRM, &old, NULL);
  return ret;
}

查询:

SELECT DISTINCT year FROM student_detail ORDER BY year

返回:

2000 
2001
2009 
2012
2013
2014
2015

我希望KP和Punjab缺少年份的数据(显示为0)。

1 个答案:

答案 0 :(得分:1)

要想失踪多年,您需要引入years表。然后,您可以使用cross join在年​​份和省份之间创建cartesian product。最后,您可以使用outer join来获取所请求的数据:

SELECT temp.name AS name, 
    GROUP_CONCAT(IFNULL(temp.height,0) order by year) AS DATA, 
    GROUP_CONCAT(year order by year) AS years 
FROM ( SELECT years.year AS year, p.name AS NAME, FLOOR(AVG(sd.height)) AS height 
      FROM (
        select 2010 year union all select 2011 union all select 2012
        union all select 2013 year union all select 2014 union all select 2015
        ) years 
      cross join province p
      left join student_detail sd on years.year = sd.year and sd.province_id = p.id 
      GROUP BY years.year, p.name 
      ORDER BY years.year ) 
      AS temp 
GROUP BY name