0

私は3つの(私はそれらを継承しました)テーブル、ユーザーテーブル、コーステーブル、およびユーザーのアクティビティを測定する必要があるテストテーブルを持っています。たとえば、次のクエリは、セットの1つに含まれるユーザーの数を取得します-

SELECT COUNT(Users.ID), `CourseSessions`.`CourseID`
FROM `Users`
LEFT OUTER JOIN `CourseSessions`
ON `Users`.`ID` = `CourseSessions`.`UserID`
WHERE `Users`.`CredentialID` IN (2, 3)
AND `CourseSessions`.`CourseID` IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
AND `CourseSessions`.`TimeIn` BETWEEN '2012-06-01' AND '2012-12-31'
GROUP BY `CourseSessions`.`CourseID`;

このような結果で-

COUNT, CourseID 
32     1
43     2 
31     3
49     4
36     5
21     6
5      7
2      15

別の数値セットのCourseSessionsをTestResultsに変更できます。問題は、誰かがコースを受講するか、テストを受講するときに発生します。

私ができる必要があるのは、ユーザーがいずれかまたは両方のテーブルに存在する場合、ユーザーを1回カウントすることです。次のように-

User     Course.courseID     Test.courseID
A              1
B              1                  1
C                                 1

コースID1のカウントは3である必要があります。

私はこれを数時間見ていて、おそらくSUM ... IFを実行する必要があると思いましたが、それは期待どおりに機能しませんでした。副選択を試しましたが、列が多すぎます。全体として、私はこれの車軸にかなり巻き付いています。

2つのテーブルにユーザーのデータが存在する場合、どうすれば単一のカウントを取得できますか?

4

1 に答える 1

2

これはあなたが探しているものをあなたに与えるはずです:

SELECT COUNT(CoursesTest.UserID), CourseID
FROM (
    SELECT UserID, CourseID
    FROM CourseSessions
    WHERE TimeIn BETWEEN '2012-06-01' AND '2012-12-31'
    -- extra filters on CourseSessions here
    UNION

    SELECT UserID, CourseID
    FROM TestResults
    -- extra filters on TestResults here
) AS CoursesTest
JOIN Users ON Users.ID = CoursesTest.UserID
WHERE
    Users.CredentialID IN (2, 3)
    AND CoursesTest.CourseID IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
GROUP BY CourseID

CourseID以前に、つまりサブクエリ内でフィルタリングした場合、クエリは少し速くなると思います。これは条件を複製することを意味しINますが、MySQLがクエリを最適化するほど賢いとは思いません。

SELECT COUNT(CoursesTest.UserID), CourseID
FROM (
    SELECT UserID, CourseID
    FROM CourseSessions
    WHERE TimeIn BETWEEN '2012-06-01' AND '2012-12-31'
    AND CourseID IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
    -- extra filters on CourseSessions here

    UNION

    SELECT UserID, CourseID
    FROM TestResults
    WHERE CourseID IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
    -- extra filters on TestResults here

) AS CoursesTest
JOIN Users ON Users.ID = CoursesTest.UserID
WHERE Users.CredentialD IN (2, 3)
GROUP BY CourseID
于 2013-02-13T19:16:12.270 に答える