MysqlのGROUTP_CONCAT()関数の使い方


文法:GROUT_CONCAT([DISTINCT] expr [,expr ...][ORDER BY。 {unsigned_インテグ | 同前name | expr)[ASC | DESC [,同前name ...]][SEPAATOR strval])この関数をデモします。まず学生選択の授業表studentを作成します。coursesとテストデータを充填します。SQLコード

CREATE TABLE student_courses (     
    student_id INT UNSIGNED NOT NULL,     
    courses_id INT UNSIGNED NOT NULL,     
    KEY(student_id)     
);     
INSERT INTO student_courses VALUES (1, 1), (1, 2), (2, 3), (2, 4), (2, 5);    
学生IDが2で選択されたコースを検索するには、次のSQL:SQLコードを使用します。 

mysql> SELECT student_id, courses_id FROM student_courses WHERE student_id=2;     
+------------+------------+     
| student_id | courses_id |     
+------------+------------+     
|          2 |          3 |     
|          2 |          4 |     
|          2 |          5 |     
+------------+------------+     
3 rows IN SET (0.00 sec)  
  出力結果は3つの記録があり、学生IDは2の学生が3、4、5の3つのコースを選んだと説明しています。PHPに入れて、この3つの記録を一つのサイクルで取らなければなりません。以下の通りです。  PHPコード

foreach ($pdo->query("SELECT student_id, courses_id FROM student_courses WHERE student_id=2") as $row) {     
    $result[] = $row['courses_id'];     
}     
で、GROUTP_を採用すればCONCAT関数とGROUT BY文はとても簡単です。次のようになります。  SQLコード 

mysql> SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;     
+------------+---------+     
| student_id | courses |     
+------------+---------+     
|          2 | 3,4,5   |     
+------------+---------+     
1 row IN SET (0.00 sec)   
このようにphpで処理するのは簡単です。  PHPコード

$row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id");     
$result = explode(',', $row['courses']);     
セパレータはまたカスタムでき、デフォルトはセパレータとして「、」に変更する場合は、SEPAATORを使用して指定します。  SQLコード

SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;     
は、このグループの値を並べ替えて文字列に接続することもできます。例えば、courses_id降順で並べます。SQLコード

SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;