Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Php 在单个列中计算不同的结果_Php_Mysql - Fatal编程技术网

Php 在单个列中计算不同的结果

Php 在单个列中计算不同的结果,php,mysql,Php,Mysql,我试图编写一个有点复杂的MySQL查询,它将计算一列中列出的与其他条件相关的不同项 目前,该列中的项目仅为:MC、SR、MP和EV 这段代码确实有效,但我的问题是,有没有更好、更有效的方法?另外,在列中添加一个新项目怎么样 $sql = "Select ps.id, ps.primary_skill, count(*) (select COUNT(*) from items i, item_primary_skill_map ipsm where i.id = ipsm.item_id

我试图编写一个有点复杂的MySQL查询,它将计算一列中列出的与其他条件相关的不同项

目前,该列中的项目仅为:MC、SR、MP和EV

这段代码确实有效,但我的问题是,有没有更好、更有效的方法?另外,在列中添加一个新项目怎么样

$sql = "Select ps.id, ps.primary_skill, 
count(*) 
(select COUNT(*)
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.itemType = 'MC') as mc_count,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.itemType = 'SR') as sr_count,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.itemType = 'MP') as mp_count,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.itemType = 'EV') as ev_count,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.dok = '1') as dok1,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.dok = '2') as dok2,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.dok = '3') as dok3,
(select COUNT(*) 
from items i, item_primary_skill_map ipsm 
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id 
and i.dok = '4') as dok4
FROM primary_skills ps
where grade =  '$pl' and subject='$subject'
";
您可以尝试以下方法:-

Select ps.id, ps.primary_skill, count(*), 
       CASE i.itemType = 'MC' THEN COUNT(*) END AS as mc_count,
       CASE i.itemType = 'SR' THEN COUNT(*) END AS as sr_count,
       CASE i.itemType = 'MP' THEN COUNT(*) END AS as mp_count,
       CASE i.itemType = 'EV' THEN COUNT(*) END AS as ev_count,
       CASE i.dok = '1' THEN COUNT(*) END,
       CASE i.dok = '2' THEN COUNT(*) END,
       CASE i.dok = '3' THEN COUNT(*) END,
       CASE i.dok = '4' THEN COUNT(*) END
from items i, item_primary_skill_map ipsm
where i.id = ipsm.item_id 
and ipsm.skill_id = ps.id FROM 
and grade =  '$pl' 
and subject='$subject'
我想这就是你问题的解决办法。

你呢

select i.itemType, count(*)
  from items i, item_primary_skill_map ipsm, primary_skills ps
 where i.id = ipsm.item_id 
   and ipsm.skill_id = ps.id 
   and ps.grade      = '$pl' 
   and ps.subject    = '$subject'      
 group by i.itemType;

不同之处在于,此查询为每个唯一值返回一行,而不是查询中的一列。对于i.dok,您也需要这样做。

我提出的解决方案使用循环:

$sql = "Select ps.id, ps.primary_skill ";
foreach ($iTypes as $type){
    $sql .=", (select COUNT(*)
    from items i, item_primary_skill_map ipsm 
    where i.id = ipsm.item_id 
    and ipsm.skill_id = ps.id 
    and i.itemType = '$type') as " . strtolower($type) . "_count ";
}
$sql .= "FROM primary_skills ps
where grade =  '$pl' and subject='$subject'";

感谢您的回复。

您能提供您希望得到的结果表吗?