Mysql 要在日期上聚合的SQL查询
我有以下数据库方案: infos(id:int,date:date,provider_id:int) 提供程序(id:int,类型:int,名称:varchar) 在任何给定的日期,我允许多达5个不同的提供者,每个提供者具有不同的类型。我想要的是这样的东西:Mysql 要在日期上聚合的SQL查询,mysql,sql,Mysql,Sql,我有以下数据库方案: infos(id:int,date:date,provider_id:int) 提供程序(id:int,类型:int,名称:varchar) 在任何给定的日期,我允许多达5个不同的提供者,每个提供者具有不同的类型。我想要的是这样的东西: select date, type_0, ..., type_n from ( select i.date, p.type, p.name from infos i left join provider p on
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
日期| provider.name,类型为0 |…|…|PROVIDER.name,类型为4|
如果在指定日期没有具有正确类型的提供程序,则应存在空值
我正在努力正确地进行设置,希望以后在我的php程序中避免这样做(比如循环所有结果,然后在那里聚合它们,这是可能的,但看起来很难看)
顺便说一句,我正在使用MySQL。试试这个。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)
您希望通过简单的联接和聚合来实现这一点:
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
没有使用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
老实说,PHP是您在这里的最佳选择,因为您必须处理所有的案例。每个provider可以有多行,或者如果只有一个provider,则可以有多个日期和类型匹配的provider。PHP表单:
for($i=0; i<5; $i++)
{
$list[] = $query->execute("SELECT name FROM query_here WHERE type=$i");
}
for($i=0;iexecute(“在这里从查询_中选择名称,其中type=$i”);
}
现在,您可以使用数组显示所需的数据。如果表包含给定
(日期、类型)的多条记录,该怎么办
pair?按日期分组无法正确处理多条记录。它将在该日期选择符合类型的第一个Provider。因此,如果您有两个类型为4的Provider…我们将如何保证我们想要的一个?非常感谢,我已经尝试了几个小时了,似乎将来我必须阅读更多SQL!@Shawn…首先,问题明确指出“5个不同的提供者,每个提供者具有不同的类型”第二,它没有说明应该选择哪一个,如果有多个没有。第三,声明的语法返回最大值,而不是第一个值。好的,将其更改为5并不困难,我的应用程序确保在同一日期不会有两个具有相同类型的提供程序。