MySQL :
日付がタイムスタンプまたは日時の場合、次のようなものを使用できます。
SELECT SUBSTRING(birthdays.your_date_field, 6, 5) AS bday, GROUP_CONCAT(users.nickname)
FROM birthdays
JOIN users USING (user_id)
GROUP BY SUBSTRING(birthdays.your_date_field, 6, 5)
ORDER BY bday ASC
個別の日付ごとに行が表示され、すべてのユーザーの誕生日がコンマ ( ) で区切られています,
。
このリクエストに関する注意事項:
SUBSTRING(birthdays.your_date_field, 6, 5)
:your_date_field
日時またはタイムスタンプの場合は、書式付きの日付が含まれるYYYY-MM-DD hh:mm:ss
ため、この文字列を切り取ってMM-DD
書式を取得する必要があります。
GROUP_CONCAT(users.nickname)
,
は、複数の行が同じグループに入る場合、グループに入る最初の行だけを使用するのではなく、コンマ ( ) を使用して列を連結することを示します。
GROUP BY
列を使用して結果をグループ化し、誕生日が同じすべてのユーザーがグループ化されるようにします。これは、単一のリクエストで列の個別の値に対して計算 (COUNT、SUM など) を行う場合にも役立ちます。
例 :
CREATE TABLE users (
id int,
nickname varchar(32)
);
insert into users ( id , nickname )
values ( 1, 'mike' ), ( 2, 'jack' ), ( 3, 'santa' ), (4, 'mario');
CREATE TABLE birthdays (
id int,
birthday datetime
);
insert into birthdays ( id , birthday )
values ( 1, '1982-01-01' ), ( 2, '1983-03-11' ), ( 3, '1984-01-01' ), ( 4, '2011-06-04' );
結果 :
mysql> SELECT SUBSTRING(birthdays.birthday, 6, 5) AS bday, GROUP_CONCAT(users.nickname)
-> FROM birthdays
-> JOIN users USING (id)
-> GROUP BY SUBSTRING(birthdays.birthday, 6, 5)
-> ORDER BY bday ASC;
+-------+------------------------------+
| bday | GROUP_CONCAT(users.nickname) |
+-------+------------------------------+
| 01-01 | mike,santa |
| 03-11 | jack |
| 06-04 | mario |
+-------+------------------------------+
3 rows in set (0.00 sec)
デモ:ここをクリック
PHP:
これらの結果を取得するための PHP 実装は次のようになります。
$dbh = new PDO("mysql:host=localhost;dbname=your_base", 'username', 'password');
$request = <<< EOT
SELECT SUBSTRING(birthdays.birthday, 6, 5) AS bday, GROUP_CONCAT(users.nickname) AS nickname
FROM birthdays
JOIN users USING (id)
GROUP BY SUBSTRING(birthdays.birthday, 6, 5)
ORDER BY bday ASC;
EOT;
$rows = $dbh->query($request)->fetchAll(PDO::FETCH_ASSOC);
var_dump($rows);
あなたに与えます:
array(3) {
[0]=>
array(2) {
["bday"]=>
string(5) "01-01"
["nickname"]=>
string(10) "mike,santa"
}
[1]=>
array(2) {
["bday"]=>
string(5) "03-11"
["nickname"]=>
string(4) "jack"
}
[2]=>
array(2) {
["bday"]=>
string(5) "06-04"
["nickname"]=>
string(5) "mario"
}
}
ここで、コンマ区切り値の代わりに配列の配列が必要な場合は、それらを分解できます (もちろん、ニックネームにコンマが含まれていない場合)。
何かのようなもの :
$days = array();
foreach ($rows as $row)
{
$days[$row['bday']] = explode(",", $row['nickname']);
}
var_dump($days);
あなたにあげる :
array(3) {
["01-01"]=>
array(2) {
[0]=>
string(4) "mike"
[1]=>
string(5) "santa"
}
["03-11"]=>
array(1) {
[0]=>
string(4) "jack"
}
["06-04"]=>
array(1) {
[0]=>
string(5) "mario"
}
}
私はあなたがすべてを手に入れたと思います.あなたの実装に頑張ってください.