要在日期聚合的SQL查询

时间:2012-11-08 22:27:05

标签: mysql sql

我有以下数据库方案:

infos(id:int,date:date,provider_id:int)

provider(id:int,type:int,name:varchar)

在任何给定日期,我允许最多5个不同的提供商,每个提供商都有不同的类型。我想要的是这样的:

日期| provider.name,类型= 0 | .... | ...... |类型= 4 |

的PROVIDER.name

如果在指定日期没有正确类型的提供者,则应该有一个空值。

我正在努力正确地设置这个设置,并希望以后在我的php程序中避免这样做(比如循环所有结果然后在那里聚合它们,这可能但是看起来很丑)。 / p>

我正在使用MySQL btw。

4 个答案:

答案 0 :(得分:0)

试试这个。 MySQL语法可能有所不同。

select 
(select convert(varchar,infos.date) + provider.name + 'with type = 0'
infos  LEFT JOIN provider
on infos.id = provide.id
and provider.type = 0 and infos.date= inputdate) +
(select provider.name + 'with type = 1'
infos  LEFT JOIN provider
on infos.id = provide.id
and provider.type = 1 and infos.date= inputdate) +
(select provider.name + 'with type = 2'
infos  LEFT JOIN provider
on infos.id = provide.id
and provider.type = 2 and infos.date= inputdate) +
(select provider.name + 'with type = 3'
infos  LEFT JOIN provider
on infos.id = provide.id
and provider.type = 3 and infos.date= inputdate) +
(select provider.name + 'with type = 4'
infos  LEFT JOIN provider
on infos.id = provide.id
and provider.type = 4 and infos.date= inputdate)

答案 1 :(得分:0)

您希望通过简单的连接和聚合来实现此目的:

select i.date,
       max(case when p.type = 1 then p.name end) as Type1,
       max(case when p.type = 2 then p.name end) as Type2,
       max(case when p.type = 3 then p.name end) as Type3,
       max(case when p.type = 4 then p.name end) as Type4
from infos i left outer join
     provider p
     on i.provider_id = p.id
group by i.date

答案 2 :(得分:0)

没有使用MySQL,但在TSQL中我会这样做:

select
  date, type_0, ..., type_n
from
(
  select
    i.date, p.type, p.name
  from infos i
  left join provider p on
    i.provider_id = p.id
) as source
pivot
(
  min(source.name)
  for source.type in (0, 1, ..., n)
) as pivotTable

答案 3 :(得分:0)

老实说,PHP是你最好的选择,因为你必须处理所有的情况。每个提供者可以有多行,或者如果只有一个提供者,则可以在日期和类型上匹配多个。 PHP表单:

for($i=0; i<5; $i++)
{
   $list[] = $query->execute("SELECT name FROM query_here WHERE type=$i");
}

现在您可以使用该数组显示所需的数据。