0

table1 と table2 の 2 つのテーブルがあります。トピックの年間分布を取得したい。トピック データ用の 2 つ目のテーブルを作成しました。ランダムなテーブル table1 と table2 を作成しました。

tabel1

id | year
1  | 2001
2  | 2003
3  | 2001
4  | 2002
5  | 2001

共有「ID」を持つ2番目のテーブルがあります

table2

id | topic | subtopic
1  | sport | volley 
1  | water | ok
1  | stock | apple
2  | stock | us 
2  | stock | pine
3  | world | uk
3  | water | salt
4  | water | sweet
4  | world | ep
5  | sport | volley
5  | stock | apple
5  | stock | pine

トピックの TOP カテゴリは、stock(3=1,2,5)、water(3=1,3,4)、sport(2=1,5)、world(2=2,4) です。

そして、上位 2 つの「トピック」データのみが必要な場合、出力データは次のようになります。

     stock | water
    ----------------
2001    2  |  2
2002    0  |  1
2003    1  |  0

これまでのところ、私は個々のトピックのためにそれを行うことができました

SELECT table1.year AS YEAR, COUNT(DISTINCT table2.id ) AS lcount
FROM table1, table2
WHERE topic = 'stock'
AND table1.id = table2.id
GROUP BY YEAR

トピックは 4 つだけに限定されず、n 個の異なるトピックが存在する可能性があります。したがって、n 個の異なるトピックが見つかります。その中からトップ2を選ぶ必要があります。

4

2 に答える 2

0

これはテストされていませんが、うまくいくはずです:

SELECT a.`year`,
    COALESCE(b_stock.rec_count, 0) as `stock`,
    COALESCE(b_water.rec_count, 0) as `water`
FROM table1 a
LEFT JOIN (
    SELECT b2.`year`, COUNT(b.*) as rec_count
    FROM table2 b
    JOIN table1 b2 ON b2.id = b.id
    WHERE b.topic = 'stock'
    GROUP BY b2.year
) b_stock ON b_stock.`year` = a.`year` 
LEFT JOIN (
    SELECT b2.`year`, COUNT(b.*) as rec_count
    FROM table2 b
    JOIN table1 b2 ON b2.id = b.id
    WHERE b.topic = 'water'
    GROUP BY b2.year
) b_water ON b_water.`year` = a.`year`
GROUP BY a.`year`
ORDER BY a.`year`
于 2013-07-01T19:43:40.690 に答える