1

の各色の数を教えてくれるクエリを作成しようとしていますFemale

White - 2
Blue - 5
Green - 13

これまでのところ、いくつかの試行をコメントアウトした次のクエリがあります。

SELECT a.id AS aid, af.field_name AS aname, afv.field_value
FROM applications app, applicants a, application_fields af, application_fields_values afv, templates t, template_fields tf
WHERE a.application_id = app.id
AND af.application_id = app.id
AND afv.applicant_id = a.id
AND afv.application_field_id = af.id
#AND af.template_id = t.id
AND af.template_field_id = tf.id
AND t.id = tf.template_id
AND afv.created_at >= '2013-01-01' 
AND afv.created_at <= '2013-12-31' 
#AND af.field_name = 'Male' 
AND afv.field_value = 1
ORDER BY aid, aname
#GROUP BY aid, aNAME
#HAVING aname = 'Female';

現在、このクエリは次のようなデータを返します。

aid |  aname   | field_value
    4  Female   1
    4  White    1
    5  Green    1
    5  Female   1
    6  Female   1
    6  White    1
    7  Blue     1
    7  Female   1
    8  Female   1
    8  Blue     1
    9  Male     1
    9  Green    1

テーブル構造:

applications:
id

application_fields:
id
application_id
field_name

applications_fields_values:
id
application_field_id
applicant_id
field_value

template:
id

template_fields:
id
template_id

applicant:
id
application_id

サンプルデータ:

application_fields
id | application_id | field_name |template_id | template_field_id
1  |        1       |     blue   |      1     |         1
2  |        1       |     green  |      1     |         2
3  |        1       |     female |      1     |         3

application_fields_values
id | application_field_id | applicant_id | field_value
4  |            1         |        1     |      1     
5  |            2         |        1     |      0     
6  |            3         |        1     |      1

templates
id |    name    |
1  | mytemplate |

template_fields
id | template_id | field_name |
1  |       1     |   blue
2  |       1     |   green
3  |       1     |   female

編集

以下のクエリで探しているものが得られると確信していますが、非常に遅く、最大のテーブルの行数は 30K 未満です。

クエリ

SELECT af.field_name AS aname, sum(afv.field_value) AS totals
    FROM applications app, applicants a, application_fields af, application_fields_values afv, templates t, template_fields tf
    WHERE a.application_id = app.id
    AND af.application_id = app.id
    AND afv.applicant_id = a.id
    AND afv.application_field_id = af.id
    AND af.template_field_id = tf.id
    AND t.id = tf.template_id
    AND afv.created_at >= '2013-01-01' 
    AND afv.created_at <= '2013-12-31' 
    AND afv.field_value = 1
    AND a.id IN (
        SELECT 
            a2.id
        FROM applications app2, applicants a2, application_fields af2, application_fields_values afv2, templates t2, template_fields tf2
        WHERE af2.application_id = app2.id
        AND afv2.applicant_id = a2.id
        AND afv2.application_field_id = af2.id
        AND af2.template_field_id = tf2.id
        AND t2.id = tf2.template_id
        AND afv2.created_at >= '2013-01-01' 
        AND afv2.created_at <= '2013-12-31' 
        #AND af2.field_name = 'Male' 
        AND af2.field_name = 'Female'
        AND afv2.field_value = 1
    )
    GROUP BY aname;

結果は次のようになります。

aname | totals
Green    2
Black    27
Blue     5
4

4 に答える 4

0

クエリは問題ないようです。WHERE句に条件を追加するだけHAVINGです。グループ化に基づいて結果を除外する場合は、内に追加する必要があります

これを試して

SELECT 
    af.field_name AS aname, 
    count(afv.field_value) as totals
FROM 
    applications app, 
    applicants a, 
    application_fields af, 
    application_fields_values afv, 
    templates t, 
    template_fields tf
WHERE 
    a.application_id = app.id
    AND af.application_id = app.id
    AND afv.applicant_id = a.id
    AND afv.application_field_id = af.id
    #AND af.template_id = t.id
    AND af.template_field_id = tf.id
    AND t.id = tf.template_id
    AND afv.created_at >= '2013-01-01' 
    AND afv.created_at <= '2013-12-31' 
    #AND af.field_name = 'Male' 
    AND afv.field_value = 1
    AND aname = 'Female'
ORDER BY 
    aname
GROUP BY 
    aNAME
于 2013-11-06T06:04:24.973 に答える
0

IN の代わりに EXISTS 関数を使用してみてください

SELECT af.field_name AS aname, sum(afv.field_value) AS totals
FROM applications app, applicants a, application_fields af, application_fields_values afv, templates t, template_fields tf
WHERE a.application_id = app.id
AND af.application_id = app.id
AND afv.applicant_id = a.id
AND afv.application_field_id = af.id
AND af.template_field_id = tf.id
AND t.id = tf.template_id
AND afv.created_at >= '2013-01-01' 
AND afv.created_at <= '2013-12-31' 
AND afv.field_value = 1
AND EXISTS (
    SELECT 
        1
    FROM applications app2, applicants a2, application_fields af2, application_fields_values afv2, templates t2, template_fields tf2
    WHERE af2.application_id = app2.id
    AND afv2.applicant_id = a2.id
    AND afv2.application_field_id = af2.id
    AND af2.template_field_id = tf2.id
    AND t2.id = tf2.template_id
    AND afv2.created_at >= '2013-01-01' 
    AND afv2.created_at <= '2013-12-31' 
    #AND af2.field_name = 'Male' 
    AND af2.field_name = 'Female'
    AND afv2.field_value = 1
    AND a.id = a2.id    -- add this condition
)
GROUP BY aname;

ソース: http://dev.mysql.com/doc/refman/5.5/en/optimizing-subqueries.html

注: この変更は、その (ソース) ページの下部にあるいくつかの条件を考慮すると、いくつかの条件に応じて速くなったり遅くなったりする場合があります。

于 2013-11-08T06:24:43.913 に答える