0

この長い質問で申し訳ありませんが、必要な結果に必要なこのSQLクエリを作成する方法がわかりません。現在実行して正常に機能している2つのクエリの概要を説明し、必要な結果の概要を説明します。どんな助けでもありがたいです。

最初のクエリ:

SELECT c.name AS name, count(*) AS total, sum(a.views) AS total_views, sum(a.views) / count(*) as average_views
FROM table_a a
JOIN table_b b ON b.id = a.b_id
JOIN table_c c ON c.id = b.c_id
WHERE a.status = 0 AND a.type in (2, 4, 5)
GROUP BY c.name ORDER BY c.name;

結果:

--------------------------------------------
name | total | total_views | average_views |
--------------------------------------------
aaaa |     2 |         150 |            75 |
bbbb |     1 |          75 |            75 |
dddd |     1 |          25 |            25 |
--------------------------------------------

2番目のクエリ:

SELECT c.name AS name, count(*) AS total, sum(a.views) AS total_views, sum(a.views) / count(*) as average_views
FROM table_a a
JOIN table_b b ON b.id = a.b_id
JOIN table_c c ON c.id = b.c_id
WHERE a.status = 0 AND a.type in (1, 3)
GROUP BY c.name ORDER BY c.name;

2番目の結果:

--------------------------------------------
name | total | total_views | average_views |
--------------------------------------------
aaaa |     2 |         200 |           100 |
bbbb |     1 |         100 |           100 |
dddd |     1 |          25 |            25 |
--------------------------------------------

このデータを含むこれらのテーブルを指定します。テーブルtable_a:

-----------------------------------
id | b_id | views | type | status |
-----------------------------------
 1 |  100 |   100 |    2 |      0 |
 2 |  200 |    75 |    4 |      0 |
 3 |  300 |    50 |    5 |      0 |
 4 |  400 |    25 |    2 |      0 |
 5 |  500 |   100 |    1 |      0 |
 6 |  600 |   100 |    1 |      0 |
 7 |  700 |   100 |    3 |      0 |
 8 |  800 |    25 |    3 |      0 |
-----------------------------------

テーブルtable_b:

-------------
id  | c_id  |
-------------
100 |  1000 |
200 |  2000 |
300 |  1000 |
400 |  4000 |
500 |  1000 |
600 |  2000 |
700 |  4000 |
800 |  1000 |
-------------

テーブルtable_c:

-------------
id   | name |
-------------
1000 | aaaa |
2000 | bbbb |
3000 | cccc |
4000 | dddd |
-------------

これは私が実際に必要としているテーブルです。これは、上記の2つのテーブルを単純に連結したものであり、共通の列は名前の列です。

-------------------------------------------------------------------------------------------------------------------------------
name | total_type245 | total_views_type245 | average_views_type245 | total_type13 | total_views_type13 | average_views_type13 |
-------------------------------------------------------------------------------------------------------------------------------
aaaa |             2 |                 150 |                    75 |            2 |                200 |                  100 |
bbbb |             1 |                  75 |                    75 |            1 |                100 |                  100 |
dddd |             1 |                  25 |                    25 |            1 |                 25 |                   25 |
-------------------------------------------------------------------------------------------------------------------------------

非常に単純なクエリである可能性が高いですが、その方法を理解できません。

ありがとう。

4

2 に答える 2

0

結果を結合するだけです。

SELECT ResultsA.name, 
total_type245, 
total_views_type245, 
average_views_type245,
total_type13,
total_views_type13,
average_views_type13

FROM
(
    SELECT c.name AS name, count(*) AS total_type245, sum(a.views) AS total_views_type245, sum(a.views) / count(*) as average_views_type245
    FROM table_a a
    JOIN table_b b ON b.id = a.b_id
    JOIN table_c c ON c.id = b.c_id
    WHERE a.status = 0 AND a.type in (2, 4, 5)
    GROUP BY name

) as ResultsA

JOIN 
(
    SELECT c.name AS name, count(*) AS total_type13, sum(a.views) AS total_views_type13, sum(a.views) / count(*) as average_views_type13
    FROM table_a a
    JOIN table_b b ON b.id = a.b_id
    JOIN table_c c ON c.id = b.c_id
    WHERE a.status = 0 AND a.type in (1, 3)
    GROUP BY name

) as ResultsB ON ResultsA.name = ResultsB.name

ORDER BY ResultsA.name
于 2012-08-29T07:27:22.600 に答える
0

さて、マットの助けを借りて、このクエリは機能します:

SELECT c.name, total_type245, total_views_type245, average_views_type245, total_type13, total_views_type13, average_views_type13
FROM table_c c
LEFT JOIN (
    SELECT c.name AS name, count(*) AS total_type245, sum(a.views) AS total_views_type245, sum(a.views) / count(*) as average_views_type245
    FROM table_a a
    JOIN table_b b ON b.id = a.b_id
    JOIN table_c c ON c.id = b.c_id
    WHERE a.status = 0 AND a.type in (2, 4, 5)
    GROUP BY name
) as ResultsA ON ResultsA.name = c.name
LEFT JOIN (
    SELECT c.name AS name, count(*) AS total_type13, sum(a.views) AS total_views_type13, sum(a.views) / count(*) as average_views_type13
    FROM table_a a
    JOIN table_b b ON b.id = a.b_id
    JOIN table_c c ON c.id = b.c_id
    WHERE a.status = 0 AND a.type in (1, 3)
    GROUP BY name
) as ResultsB ON ResultsB.name = c.name;

しかし、これはその仕事にとって最も効率的なクエリですか?クエリの多くを繰り返しているようですが、唯一の変更点はa.type値が違いです。

于 2012-08-29T22:52:43.057 に答える