0

私は次のデータベーススキームを持っています:

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

プロバイダー(id:int、type:int、name:varchar)

任意の日付で、それぞれが異なるタイプを持つ最大5つの異なるプロバイダーを許可します。私が欲しいのはこのようなものです:

日付| タイプ=0のprovider.name| .... | ... | タイプ=4のPROVIDER.name|

指定された日付に正しいタイプのプロバイダーがない場合は、null値が存在するはずです。

私はこの設定を正しく行うのに苦労しており、後でphpプログラムでそれを行わないようにしたいと思います(すべての結果をループしてそこで集約するなど、可能ですが醜いようです)。

私はMySQLを使用しています。

4

4 に答える 4

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 が最善の策です。プロバイダごとに複数の行を持つことができます。または、プロバイダが 1 つしかない場合は、日付とタイプが一致する多数の行を持つことができます。PHP フォーム:

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

これで、配列を使用して必要なデータを表示できます。

于 2012-11-08T22:57:56.673 に答える
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 に答える