-1

リモート ワーカーを追跡するのに役立つ休日レポート ツールを作成しています。趣味としてコーディングを学んでいるので、これも言い訳にしています。

テーブルに全員の休日の概要を作成する必要があります (上部に個々の日付、下部に名前) が、行き詰まっており、助けが必要です。

2 つのテーブルがあります。1 つはユーザーの詳細を含み、もう 1 つはユーザー ID を使用して関連付けられた休日のレコードを格納します。期間の開始日と終了日を記録するだけで、必要な情報を多次元配列に取得して HTML テーブルを作成する方法を理解するのに苦労しています。

for each ループを使用していると確信していますが、理解できません。誰か助けてもらえますか?

4

1 に答える 1

2

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"
  }
}

私はあなたがすべてを手に入れたと思います.あなたの実装に頑張ってください.

于 2012-11-25T15:48:06.543 に答える