我有以下数据库方案:
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。
答案 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");
}
现在您可以使用该数组显示所需的数据。