PREPAREDステートメントでこれを受け取ることができます。最初のクエリは、テーブル内のすべてのs_idを含むクエリを生成します。あなただけのあなたのテーブル名にYOYOURTABLEを変更する必要があります。 サンプルを参照してください
CONCAT('SELECT `date`,'
,GROUP_CONCAT(f1)
,' FROM YOURTABLE GROUP BY DATE')
INTO @myquery
FROM (
SELECT DISTINCT CONCAT('sum(s_id = ',s_id,') AS sid_',s_id) AS f1
FROM yourtable
) tab1;
-- ONLY for Test to verify the Query
SELECT @myquery;
PREPARE test FROM @myquery;
EXECUTE test;
DEALLOCATE PREPARE test;
サンプル
mysql> SELECT * FROM yourtable;
+------+------------+
| s_id | date |
+------+------------+
| 1 | 2016-01-01 |
| 1 | 2017-02-02 |
| 2 | 2017-01-05 |
| 4 | 2016-03-04 |
| 7 | 2016-12-12 |
+------+------------+
5 rows in set (0,01 sec)
mysql> SELECT
-> CONCAT('SELECT `date`,'
-> ,GROUP_CONCAT(f1)
-> ,' FROM YOURTABLE GROUP BY DATE')
-> INTO @myquery
-> FROM (
-> SELECT DISTINCT CONCAT('sum(s_id = ',s_id,') AS sid_',s_id) AS f1
-> FROM yourtable
-> ) tab1;
Query OK, 1 row affected (0,01 sec)
mysql> SELECT @myquery;
+----------------------------------------------------------------------------------------------------------------------------------------+
| @myquery |
+----------------------------------------------------------------------------------------------------------------------------------------+
| SELECT `date`,sum(s_id = 1) AS sid_1,sum(s_id = 2) AS sid_2,sum(s_id = 4) AS sid_4,sum(s_id = 7) AS sid_7 FROM YOURTABLE GROUP BY DATE |
+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)
mysql> PREPARE test FROM @myquery;
Query OK, 0 rows affected (0,00 sec)
mysql> EXECUTE test;
+------------+-------+-------+-------+-------+
| date | sid_1 | sid_2 | sid_4 | sid_7 |
+------------+-------+-------+-------+-------+
| 2016-01-01 | 1 | 0 | 0 | 0 |
| 2016-03-04 | 0 | 0 | 1 | 0 |
| 2016-12-12 | 0 | 0 | 0 | 1 |
| 2017-01-05 | 0 | 1 | 0 | 0 |
| 2017-02-02 | 1 | 0 | 0 | 0 |
+------------+-------+-------+-------+-------+
5 rows in set (0,00 sec)
mysql> DEALLOCATE PREPARE test;
Query OK, 0 rows affected (0,00 sec)
mysql>
"正規化" の出力を使用してください。すべてのIDがすぐにわからない場合、S_ID(行)を列に変換するのは悪いです。 'Group by S_ID、DATE'を使用して、ユーザーと日ごとに「使用可能な結果」を取得します。 – dognose
ああ、 "累積的" - 正規化されたクエリに少しオーバーヘッドが追加されます:-) – dognose