【问题标题】:JSON PHP Join multimensional ArrayJSON PHP Join 多维数组
【发布时间】:2015-01-23 08:42:14
【问题描述】:

我尝试通过 php 从我的 mysql 数据库中获取数据。我想使用 json,因为它在我们的 android 应用程序中处理起来非常好。

我尝试以下方法: 我们有三个数据表:

User:
-id
-name

REF_Interests
-ref_interests_id
-interestName

User_Ref_Interests
-id
-userid
-ref_interests_id

我们创建了多个用户和兴趣,例如 ref_interests_id = 1(例如)的“游泳”

如何才能为每个用户获取一个 Row,其中的数组包含这样的兴趣:

User:
-id
-name
-interests:
  --interest
    ---ref_interest_id
    ---interestName
  --interest
    ---ref_interest_id
    ---interestName
  --...
    ---...
    ---...

如果该用户有 4 个兴趣,我加入为该用户返回 4 行的表。我认为这很难处理。那么有没有比我的实际解决方案更好的方法?

谢谢你千百次!

【问题讨论】:

  • 您是否尝试使用 php 函数 json_encode() 将数组编码为 jason?
  • 是的,我正在对其进行编码。但是我的 SQL 查询为用户的每个兴趣返回多行
  • 对于用户,一旦您获得多行的结果集,就在结果集上运行 foreach 循环并捕获数组中的值,然后将其编码为 json。

标签: php mysql arrays json


【解决方案1】:

很遗憾,您不能在一个 MySQL 查询中完成。

我可以提出 2 个解决方案:

  1. 运行 2 个查询:获取用户和获取兴趣(使用 IN SQL 运算符)。然后将它们全部混合到一个数组中。这将是一个非常快速的解决方案(因为您只有 2 个查询)。但是你必须写一些PHP代码
  2. 运行多个查询:获取所有用户并为每个用户获取其兴趣。它会很慢,但代码会更简单。此方案可用于分页情况(LIMIT

我希望它会有所帮助。

编辑 2:

前两种查询方式。它只从数据库中获取需要的数据:

<?
$pdo  = new PDO('mysql:host=localhost;dbname=tesst', 'root', '');

// add your conditions into WHERE section
$stmt = $pdo->prepare('SELECT * FROM User WHERE 1=1');
$stmt->execute();
$rawUsers = $stmt->fetchAll(PDO::FETCH_ASSOC);

$userIds = array();
$users   = array();
foreach ($rawUsers as $user) {
    $userIds[] = (int)$user['id'];
    $users[$user['id']] = $user;
    $users[$user['id']]['interests'] = array();
}

$stmt = $pdo->prepare('
    SELECT *
        FROM User_Ref_Interests
            JOIN REF_Interests
            ON REF_Interests.ref_interests_id = User_Ref_Interests.ref_interests_id
    WHERE User_Ref_Interests.userid IN ('.implode(',', $userIds).')
');
$stmt->execute();
$interests = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($interests as $interest) {
    $users[$interest['userid']]['interests'][] = array('ref_interest_id' => $interest['ref_interests_id'], 'interestName' => $interest['interestName']);
}

echo '<pre>';
echo json_encode($users, JSON_PRETTY_PRINT);
echo '</pre>';

输出将是:

{
    "1": {
        "id": "1",
        "name": "u1",
        "interests": [
            {
                "ref_interest_id": "1",
                "interestName": "i1"
            },
            {
                "ref_interest_id": "2",
                "interestName": "u2"
            },
            {
                "ref_interest_id": "3",
                "interestName": "i3"
            }
        ]
    },
    "2": {
        "id": "4",
        "name": "u4",
        "interests": []
    }
}

【讨论】:

  • 解决方案 1 听起来很有趣。你能帮我一些代码吗?我是 Mysql 和 PHP 的新手,真的不知道在 google 上搜索什么:/
  • 很好的答案,谢谢。但我没有让它工作。我在每一行之后写了 echo "x" 并在这一点结束: foreach ($rawUsers as $user) { } 即使我从这个 foreach 中删除了代码,在这个 foreach 之后也没有 echo 输出。请你再帮我一次好吗?
  • @BenjaminWolf 请将error_reporting(E_ALL); ini_set('display_errors', '1'); 添加到 PHP 文件的开头并再次运行。它必须向您显示 PHP 错误。
  • @BenjaminWolf 也请告诉我 - 你使用的是什么 PHP 版本?
  • 由于代码太长,我写了一个新答案。请看一下新的答案。没有显示错误。编辑:版本是 5.3.29。不好了。你有这个版本的参考或代码吗?
【解决方案2】:

我像这样将代码更改为我的需要,但是当我在谷歌浏览器中调用它时它没有显示任何错误。

<?php
error_reporting(E_ALL);
 ini_set('display_errors', '1');
//
// NOTE: this code for PHP 5.4 and greater (because i use new array syntax)
//
echo "0";

$pdo  = new PDO('mysql:host=servername;dbname=dbname', 'name', 'pw');
echo "1";
// add your conditions into WHERE section
$stmt = $pdo->prepare('SELECT * FROM user WHERE 1=1');
$stmt->execute();
$rawUsers = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "2";
$userIds = [];
$users   = [];
foreach ($rawUsers as $user) {
    $userIds[] = (int)$user['id'];
    $users[$user['id']] = $user;
    $users[$user['id']]['interests'] = [];
}
echo "3";
$stmt = $pdo->prepare('
    SELECT *
        FROM zuordnunguserinteressen
            JOIN interessen
            ON interessen.id = zuordnunguserinteressen.InteressenID
    WHERE zuordnunguserinteressen.UserID IN ('.implode(',', $userIds).')
');
echo "4";
$stmt->execute();
$interests = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "2";
foreach ($interests as $interest) {
    $users[$interest['userid']]['interests'][] = ['InteressenID' => $interest['InteressenID'], 'Interesse' => $interest['Interesse']];
}

echo '<pre>';
echo json_encode($users, JSON_PRETTY_PRINT);
echo '</pre>';

?>

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2016-05-23
    • 2016-06-11
    • 2020-06-21
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多