0

我有以下数据库方案:

信息(id:int,日期:date,provider_id:int)

提供者(id:int,类型:int,名称:varchar)

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

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

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

我正在努力正确地进行此设置,并希望避免稍后在我的 php 程序中执行此操作(例如循环所有结果,然后将它们聚合到那里,这是可能的,但似乎很难看)。

我正在使用 MySQL 顺便说一句。

4

4 回答 4

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)
于 2012-11-08T22:41:05.813 回答
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
于 2012-11-08T22:42:40.257 回答
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
于 2012-11-08T22:43:25.027 回答
0

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

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

现在您可以使用数组来显示您需要的数据。

于 2012-11-08T22:57:56.673 回答