Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 要在日期上聚合的SQL查询_Mysql_Sql - Fatal编程技术网

Mysql 要在日期上聚合的SQL查询

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

我有以下数据库方案:

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
    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并不困难,我的应用程序确保在同一日期不会有两个具有相同类型的提供程序。