具有计数的MySQL子查询:结果不正确

具有计数的MySQL子查询:结果不正确,mysql,sql,Mysql,Sql,我有一个单独的MySQL查询,它生成我想要查看的表。 这显示了特定考古阶段的后罗马陶器织物数量 SELECT post_roman_pot.PRP_Fabric, Count(post_roman_pot.PRP_Fabric) AS count, post_roman_pot.Site_id, context_register.Phase FROM post_roman_pot INNER JOIN context_register ON post_roman_po

我有一个单独的MySQL查询,它生成我想要查看的表。 这显示了特定考古阶段的后罗马陶器织物数量

  SELECT
  post_roman_pot.PRP_Fabric,
  Count(post_roman_pot.PRP_Fabric) AS count,
  post_roman_pot.Site_id,
  context_register.Phase
FROM
  post_roman_pot
  INNER JOIN context_register ON post_roman_pot.Site_Code = context_register.Site_Code AND post_roman_pot.Context =
    context_register.Context
WHERE
  post_roman_pot.Site_id = 6 AND
    context_register.Phase = 'fen14-ph12'
GROUP BY
  post_roman_pot.PRP_Fabric
ORDER BY
  post_roman_pot.PRP_Fabric
;
我想看到的是一张表中所有阶段的织物计数。我可以继续运行查询并更改“where”列中的阶段号,但我想看看是否可以作为一个表来执行

这是我想到的最好的。语法是错误的,我就是不知道怎么做。也许有人能告诉我我做错了什么。我只添加了两个阶段

    select 
post_roman_pot.site_id,
post_roman_pot.prp_fabric,
(select count(post_roman_pot.prp_fabric) from post_roman_pot where       post_roman_pot.Site_id = 6 AND context_register.Phase = 'fen14-ph12' )as 'Phase12'
(select count(post_roman_pot.prp_fabric) from post_roman_pot where post_roman_pot.Site_id = 6 AND context_register.Phase = 'fen14-ph13' )as 'Phase13'
from post_roman_pot 
INNER JOIN context_register ON post_roman_pot.Site_Code = context_register.Site_Code AND post_roman_pot.Context =
    context_register.Context
 where post_roman_pot.site_id=6
 group by post_roman_pot.prp_fabric
 order by post_roman_pot.prp_fabric
 ;
示例数据。这是第一个查询的结果示例: (不确定如何调用html表)

组合查询的结果类似于

Site_id, PRP_Fabric, Phase12 {count}, Phase 13 {count}
6,       BORDB,        3,              2
6,       BORDG,        3,              0
6,       BORDG CHP2,   3,              6
6,       BORDO,        12,             0
所以我算出了语法错误是什么-括号放错地方了。 查询向我显示的结果是507,其中针对阶段存在结构。507是站点6的数据集中的结构数

因此,上述结果如下所示:

Site_id, PRP_Fabric, Phase12 {count}, Phase 13 {count}
6,       BORDB,        507,              507
6,       BORDG,        507,              0
6,       BORDG CHP2,   507,              507
6,       BORDO,        507,              0

因此,这个查询有点不合适

只需按上下文分组

 SELECT
  Count(post_roman_pot.PRP_Fabric) AS count,
  post_roman_pot.Site_id,
  context_register.Phase
FROM
  post_roman_pot
  INNER JOIN context_register ON post_roman_pot.Site_Code = context_register.Site_Code AND post_roman_pot.Context =
    context_register.Context
WHERE
  post_roman_pot.Site_id = 6
GROUP BY
  context_register.Phase
;

您希望每个站点和结构有一个结果行,因此这些是您分组的列。然后你要计算每个阶段。为此,请使用条件聚合,即对大小写表达式进行计数:

select
  prp.site_id,
  prp.prp_fabric,
  count(case when cr.phase = 'fen14-ph12' then 1 end) as phase12,
  count(case when cr.phase = 'fen14-ph13' then 1 end) as phase13
from post_roman_pot prp
join context_register cr on prp.site_code = cr.site_code and prp.context = cr.context
group by prp.site_id, prp.prp_fabric
order by prp.site_id, prp.prp_fabric;
在MySQL中,其中
true=1
false=0
,您可以使用
sum
进行计数,使其更具可读性,也许:

select
  prp.site_id,
  prp.prp_fabric,
  sum(cr.phase = 'fen14-ph12') as phase12,
  sum(cr.phase = 'fen14-ph13') as phase13
from post_roman_pot prp
join context_register cr on prp.site_code = cr.site_code and prp.context = cr.context
group by prp.site_id, prp.prp_fabric
order by prp.site_id, prp.prp_fabric;

如果发现一个罗马罐会发生什么?您能提供示例表和数据吗?示例如图所示。不确定如何在这个forumRoman pot中创建一个表,因为它被记录在另一个表中。请为context\u register也提供数据样本
…,site\u id该查询将获得每个阶段的总结构计数。不完全是我想要的,但是谢谢。太好了。就是这样,非常感谢托尔斯滕·凯特纳。有两件事我不知道——使用case和我不知道的可以这样缩写表名。我得回到手册上再读一遍。
select
  prp.site_id,
  prp.prp_fabric,
  sum(cr.phase = 'fen14-ph12') as phase12,
  sum(cr.phase = 'fen14-ph13') as phase13
from post_roman_pot prp
join context_register cr on prp.site_code = cr.site_code and prp.context = cr.context
group by prp.site_id, prp.prp_fabric
order by prp.site_id, prp.prp_fabric;