2016-11-11 22 views
0

私は現在存在する教室あたりの生徒の数を取得しようとしています。 (<> '00 DropTime:00' とPickupTime = '00:00' )ClassroomIDが< 99ある教室からユニオンMYSQLのGROUP BY

  1. すべての学生と持っている:そして日がある20161111

  2. 条件は、

  3. ClassroomId>が99であるとしていた教室(DropTime = '00:00' )からのすべての学生と日付は、私が目を使用しています20161111

ですE MySQLでクエリ以下、それが正常に動作し、私は正しい結果を得る:私は別の教室での結果(すなわちClassroomID> 99)を得るために労働組合をしようとするときを除き、

SELECT 
    COUNT(a.Id) AS total, c.Name 
FROM 
    Attendance a 
INNER JOIN 
    Classroom c ON a.classroom = c.Id 
WHERE 
    DropDate = '20161111' 
AND DropTime <> '00:00' 
AND PickupTime = '00:00' 
GROUP BY Name 

を、各をもたらすものではありませんトータル数で1教室しか持たない。 これは私が使用しているユニオンのクエリです。

SELECT 
SUM(total), Name 
FROM 
(SELECT 
    COUNT(a.Id) AS total, c.Name 
FROM 
    Attendance a 
INNER JOIN Classroom c ON a.classroom = c.Id 
WHERE 
    DropDate = '20161111' 
     AND DropTime <> '00:00' 
     AND PickupTime = '00:00' 
     AND c.Id < 99 
UNION ALL 
    SELECT 
    COUNT(a.Id) AS total, c.Name 
FROM 
    Attendance a 
INNER JOIN Classroom c ON a.classroom = c.Id 
WHERE 
    DropDate = '20161111' 
     AND PickupTime = '00:00' 
     AND c.Id > 99) t 
GROUP BY Name 

答えて

1

グループごとにグループ化する必要があります。したがって、あなたは3つのグループを必要とします。 1は両方とも集約しているので、それぞれのユニオンステートメントのために1つの外側の選択...あなたもそこに集約しているので。

別の言い方をすれば、各クエリは別の方法で操作できるように、それ自身で操作できる必要があります。あなたの2つのインラインクエリは、グループ化されていないためにほとんどのRDBMSシステムで失敗しますが、MYSQLの拡張グループはこれを複雑にします。

しかし、クエリを書くためのより効率的な方法があるかもしれません...しかし、ここにあなたの初心者の試みに基づいて動作するバージョンです。

SELECT 
SUM(total), Name 
FROM 
(SELECT 
    COUNT(a.Id) AS total, c.Name 
FROM 
    Attendance a 
INNER JOIN Classroom c ON a.classroom = c.Id 
WHERE 
    DropDate = '20161111' 
     AND DropTime <> '00:00' 
     AND PickupTime = '00:00' 
     AND c.Id < 99 
GROUP BY c.name 
UNION ALL 
    SELECT 
    COUNT(a.Id) AS total, c.Name 
FROM 
    Attendance a 
INNER JOIN Classroom c ON a.classroom = c.Id 
WHERE 
    DropDate = '20161111' 
     AND PickupTime = '00:00' 
     AND c.Id > 99 
GROUP BY c.name) t 
GROUP BY t.name 

これはsimplierように見えると(私が何かを台無しにしなかった場合)同じ結果を得る必要があり、それは3種類のセットを生成し、それらを結合する必要がないとして、それは速くなければなりません。

SELECT COUNT(a.Id) AS total 
    , c.Name 
FROM Attendance a 
INNER JOIN Classroom c 
    ON a.classroom = c.Id 
WHERE DropDate = '20161111' 
    AND ((DropTime <> '00:00' AND PickupTime = '00:00' AND c.Id < 99) 
    OR (PickupTime = '00:00' AND c.Id > 99)) 
GROUP BY c.name 
+0

ありがとうございます! – snowflakes74