2015-08-05 4 views
0
SELECT fullname, 
SUM(IF(mark='c',1,0)) AS compensations, 
ROUND(AVG(mark)) AS avg_mark 
FROM evaluation 
WHERE subject='$subject' AND fullname IN 
(SELECT fullname 
FROM campus 
WHERE user_levels=1) 
GROUP BY fullname ASC 


SELECT fullname, 
SUM(IF(attend='a',1,0)) AS absences 
FROM attendance 
WHERE subject='subject I' AND fullname IN 
(SELECT fullname FROM campus WHERE user_levels=1) 
GROUP BY fullname ASC 

Мне нужно отобразить для каждого учащегося, который соответствует утверждениям: полное имя, avg_mark, компенсации и среднее значение.Как присоединиться к двум операторам SELECT?

Эти два кода работают отлично самостоятельно, но я не могу представить их вместе. Пожалуйста, любая помощь будет очень признательна.

+0

если у вас есть столбец полного имени в таблице оценки и посещаемости и кампуса, то ваша схема де-нет rmalized – Drew

+1

@DrewPierce Почему? Даже если есть отдельная таблица «Студент», в качестве основного ключа может использоваться «полное имя». –

+0

уверенный предмет. Естественные ключи, которые меняются. бежать с ним – Drew

ответ

0

Эти столы выглядят очень странно. Зачем хранить полное имя в трех разных таблицах? Не выглядит правильным.

также:

  • Использование INNER JOIN в предпочтении к IN (...)
  • рекомендуют использовать тематические выражения через функцию IF()

Однако, я думаю, что неполадка может работа:

SELECT 
     c.fullname 
    , SUM(CASE 
      WHEN e.mark = 'c' THEN 1 
      ELSE 0 
     END) AS compensations 
    , ROUND(AVG(e.mark)) AS avg_mark 
    , SUM(CASE 
      WHEN a.attend = 'a' THEN 1 
      ELSE 0 
     END) AS absences 
FROM campus c 
LEFT JOIN evaluation e 
     ON c.fullname = e.fullname 
     AND e.subject = '$subject' 
LEFT JOIN attendance a 
     ON c.fullname = a.fullname 
     AND a.subject = 'subject I' 
WHERE c.user_levels = 1 
GROUP BY c.fullname 
;