php - 从数据库中获取多维数组

标签 php mysql select join

有没有办法运行一个 mysql查询并获取多维数组?

例如,假设您有一个特定用户,并且您想要获取该用户的数据以及该用户的最新事件/事件。

表结构类似于:

用户表:

ID | username | emailaddress | firstname | lastname | dateofbirth

事件表:

ID | user | event_label | timestamp

当然可以只有一个唯一用户,但该用户可以有多个事件。因此,如果我对这两个表执行LEFT JOIN,我将必须使用 while 循环来获取所有事件行。但每次迭代时,我都会再次从 users 表中获得相同的数据。

例如,查询代码可能如下所示:

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$id = 123456;
$select = $mysqli->query("
  SELECT users.*, events.event_label, events.timestamp
  FROM users
    LEFT JOIN events ON users.id=events.user    
  WHERE users.id=$id
");
while ($row = $select->fetch_assoc()) {
    $result[] = $row;
}
echo "<pre>";
print_r($result);
exit("</pre>");

/*
Sample output:
    Array (
    [0] => Array
        (
            [id] => 1
            [username] => name
            [emailaddress] => joe@example.com
            [firstname] => Joe
            [lastname] => Test
            [dateofbirth] => 2015-07-10
            [event_label] => Subscribe
            [timestamp] => 2015-07-10 00:00:00
        )
    [1] => Array
        (
            [id] => 1
            [username] => name
            [emailaddress] => joe@example.com
            [firstname] => Joe
            [lastname] => Test
            [dateofbirth] => 2015-07-10
            [event_label] => Visit
            [timestamp] => 2015-07-10 01:00:00
        )
    [2] => Array
        (
            [id] => 1
            [username] => name
            [emailaddress] => joe@example.com
            [firstname] => Joe
            [lastname] => Test
            [dateofbirth] => 2015-07-10
            [event_label] => phonecall
            [timestamp] => 2015-07-10 03:00:00
        )
)
*/

期望的结果如下所示。我知道我可以在 PHP 中重新排列数据,但我想知道是否可以使用 MySQL 实现相同的目的。

/*
Desired output:
    Array (
    [0] => Array (
        [id] => 1
        [username] => name
        [emailaddress] => joe@example.com
        [firstname] => Joe
        [lastname] => Test
        [dateofbirth] => 2015-07-10
        [events] => Array (
                [0] => Array (
                     [event_label] => Subscribe
                     [timestamp] => 2015-07-10 00:00:00
                )
                [1] => Array (
                     [event_label] => Visit
                     [timestamp] => 2015-07-10 01:00:00
                )
                [2] => Array (
                     [event_label] => phonecall
                     [timestamp] => 2015-07-10 03:00:00
                )
        )
)
*/

最佳答案

您应该能够稍微更改您的 Select 语句以使处理更容易:

$select = $mysqli->query("
  SELECT users.username,
  users.emailaddress,
  users.firstname,
  users.lastname,
  users.dateofbirth,
  events.event_label,
  events.timestamp
  FROM users
    LEFT JOIN events ON users.id=events.user    
  WHERE users.id=$id
");

然后修改您的 while 循环,以便在 php 中获取多维数组

while ($row = $select->fetch_assoc()) {
    $result[[$row['id']] = $row;
}

关于php - 从数据库中获取多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31344800/

相关文章:

PHP preg_replace问题

php - 字符编码和使用 Zend\Dom\Query

javascript - 将这个简单的 Javascript 转换为 PHP

php - 使用具有外键的内连接删除

mysql - 比较日期时间不起作用

hibernate 内部从子句中选择

php - 从一个表中选择字段并在另一表中匹配它并返回值

c++ - MySQL C++ 连接器是否比 MySQL C API 慢?

mysql - SQL 查询 : How to get data from four different tables

mysql - 将此 SQL 查询转换为 Codeigniter Active Record