0

このようなテーブル「イベント」があります

   id   |  user_id   |   date     |  is_important
---------------------------------------------------
   1    |     3      | 01/02/2012 |       0
   1    |     3      | 01/02/2012 |       1
   1    |     3      | 01/02/2011 |       1
   1    |     3      | 01/02/2011 |       1
   1    |     3      | 01/02/2011 |       0

基本的に、私が取得する必要があるのはこれです:

(for the user_id=3)

   year   |  count   |   count_importants
--------------------------------------------
  2012    |    2     |          1
  2011    |    3     |          2

私はこれを試しました:

SELECT YEAR(e1.date) as year,COUNT(e1.id) as count_total, aux.count_importants
FROM events e1 
LEFT JOIN 
(
  SELECT YEAR(e2.date) as year2,COUNT(e2.id) as count_importants
  FROM `events` e2
  WHERE e2.user_id=18 
  AND e2.is_important = 1
  GROUP BY year2
) AS aux ON aux.year2 = e1.year
WHERE e1.user_id=18 
GROUP BY year

しかし、mysqlは私にエラーを与えます

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'aux ON aux.year2 = e1.year WHERE e1.user_id=18 GROUP BY year LIMIT 0, 30' at line 10

そして、このクエリ u_Uº を作成するためのアイデアが不足しています。1つのクエリのみを使用してこれを行うことは可能ですか??

前もって感謝します

4

2 に答える 2

1

編集:物事を複雑にしすぎたと思います。簡単なクエリでこれを行うことはできませんか?

SELECT 
    YEAR(`year`) AS `year`, 
    COUNT(`id`) AS `count`, 
    SUM(`is_important`) AS `count_importants`
FROM `events`
WHERE user_id = 18
GROUP BY YEAR(`year`)

要約を追加する大きなソリューションは次のとおりです:)

MySQL GROUP BY ROLLUPの使用を検討してください。これは基本的に通常の GROUP BY と同様の機能を果たしますが、集計用の行も追加します。

以下の例では、2000 年のフィンランドの 1500 ポンドと 100 ポンドの 2 つのレコードと、合計値が 1600 ポンドのNULL製品を含む行が表示されます。また、グループ化されたディメンションごとに NULL ロールアップ行を追加します。

マニュアルから:

SELECT year, country, product, SUM(profit)
FROM sales
GROUP BY year, country, product WITH ROLLUP

+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | India   | NULL       |        1350 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2000 | USA     | NULL       |        1575 |
| 2000 | NULL    | NULL       |        4525 |
| 2001 | Finland | Phone      |          10 |
| 2001 | Finland | NULL       |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
| 2001 | USA     | NULL       |        3000 |
| 2001 | NULL    | NULL       |        3010 |
| NULL | NULL    | NULL       |        7535 |
+------+---------+------------+-------------+

あなたの状況に具体的に一致する例を次に示します。

SELECT year(`date`) AS `year`, COUNT(`id`) AS `count`, SUM(`is_important`) AS `count_importants`
FROM new_table
GROUP BY year(`date`) WITH ROLLUP;
于 2012-05-11T09:49:56.193 に答える
0

エイリアスyear-year(e1.date) AS yearは JOIN ON 句では表示されません。この条件を使用してみてください -

...
LEFT JOIN
(
...
) ON aux.year2 = year(e1.date) -- e1.year --> year(e1.date)
...
于 2012-05-11T09:43:29.040 に答える