1

このUNIONクエリを使用して、クエリが提供するレコードをカウントしています。

これは私の質問です:

// Count the number of records:
$q = "SELECT COUNT( DISTINCT i.institute_id)    
          FROM institutes AS i
            INNER JOIN institute_category_subject AS ics 
                ON ics.institute_id = i.institute_id
            INNER JOIN subjects AS s 
                ON ics.subject_id = s.subject_id
          WHERE s.subject_name LIKE '%mathematics%'
        UNION
        SELECT COUNT( DISTINCT t.tutor_id)
          FROM tutors AS t
            INNER JOIN tutor_category_subject  AS tcs
                ON tcs.tutor_id = t.tutor_id
            INNER JOIN subjects AS s
                ON tcs.subject_id = s.subject_id
          WHERE s.subject_name LIKE '%mathematics%'";

このクエリを実行した後、出力として以下の結果が得られました。

+---------------------------------+
| COUNT( DISTINCT i.institute_id) |
+---------------------------------+
|                               3 |
|                               2 |
+---------------------------------+

これは私の期待する結果ではありません。3 + 2を追加して、結果として5を取得する必要があります。2つの選択クエリを追加します。

誰かが私がこれをどのように理解するか教えてもらえますか?

あなたを考えてください。

4

2 に答える 2

5

UNIONedクエリをサブクエリでラップする

SELECT SUM(total) totalSum
FROM
    (
        SELECT  COUNT( DISTINCT i.institute_id) total
        FROM    institutes AS i
                INNER JOIN institute_category_subject AS ics 
                    ON ics.institute_id = i.institute_id
                INNER JOIN subjects AS s 
                    ON ics.subject_id = s.subject_id
        WHERE   s.subject_name LIKE '%mathematics%'
        UNION
        SELECT  COUNT( DISTINCT t.tutor_id)   total
        FROM    tutors AS t
                INNER JOIN tutor_category_subject  AS tcs
                    ON tcs.tutor_id = t.tutor_id
                INNER JOIN subjects AS s
                    ON tcs.subject_id = s.subject_id
        WHERE   s.subject_name LIKE '%mathematics%'
    ) s
于 2013-02-17T13:39:04.050 に答える
3

行をカウントしているので、合計+カウント+カウントの追加のオーバーヘッドは必要ありません。

これを行うだけです:

$q = "SELECT COUNT(*) FROM (
    SELECT DISTINCT i.institute_id
      FROM institutes AS i
        INNER JOIN institute_category_subject AS ics 
            ON ics.institute_id = i.institute_id
        INNER JOIN subjects AS s 
            ON ics.subject_id = s.subject_id
      WHERE s.subject_name LIKE '%mathematics%'
    UNION ALL
    SELECT DISTINCT t.tutor_id
      FROM tutors AS t
        INNER JOIN tutor_category_subject  AS tcs
            ON tcs.tutor_id = t.tutor_id
        INNER JOIN subjects AS s
            ON tcs.subject_id = s.subject_id
      WHERE s.subject_name LIKE '%mathematics%'
  ) mysubquery";
于 2013-02-17T13:41:36.763 に答える