2015-02-05 3 views
0

Я пытаюсь написать несколько сложный запрос 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' 
"; 
+0

Вы могли бы предоставить таблицу результатов, которую вы ожидаете получить? – Alex

ответ

0

Решение, которое я придумал использования петли:

$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'"; 

Спасибо за все ответы.

0

Вы можете попробовать это: -

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' 

Я думаю, что это решение для вашей проблемы.

0

насчет

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; 

разница в том, что этот запрос возвращает 1 строку для каждого уникального значения, а не 1 столбец в запросе. для i.dok вам нужно будет сделать то же самое.

Смежные вопросы