我正在创建一个假期报告工具来帮助我跟踪我的远程工作人员,同时也以此为借口,因为我正在学习编码作为一种爱好。
我需要在表格中创建每个人的假期摘要(顶部的个人日期,侧面的名称)但我卡住了,需要一些帮助。
我有两个表,一个包含用户详细信息,另一个存储使用用户 ID 捆绑在一起的假期记录。我只记录该期间的开始和结束日期,并且正在努力理解如何将所需的信息放入多维数组中以从中构建 HTML 表。
我确定它使用了一个 for each 循环,但我无法理解它,有人可以帮忙吗?
我正在创建一个假期报告工具来帮助我跟踪我的远程工作人员,同时也以此为借口,因为我正在学习编码作为一种爱好。
我需要在表格中创建每个人的假期摘要(顶部的个人日期,侧面的名称)但我卡住了,需要一些帮助。
我有两个表,一个包含用户详细信息,另一个存储使用用户 ID 捆绑在一起的假期记录。我只记录该期间的开始和结束日期,并且正在努力理解如何将所需的信息放入多维数组中以从中构建 HTML 表。
我确定它使用了一个 for each 循环,但我无法理解它,有人可以帮忙吗?
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"
}
}
我认为你得到了一切,祝你实施顺利。