【问题标题】:Multiple json from a database using php使用php从数据库中获取多个json
【发布时间】:2021-08-18 15:04:59
【问题描述】:

我有两个表 ERRORS 和 PRODUCTS,它们由两列相关联(error_code 和 issue)我想使用 php 获取响应 json。这些是我的文件:

表格

错误:

id_error error_code issue cause solution
1 A01 issue1 cause1.1 solution1.1
2 A01 issue1 cause1.2 solution1.2
3 A01 issue1 cause1.3 solution1.3
4 A02 issue2 cause2.1 solution2.1

产品:

id_error product issue
A01 P1 issue1
A01 P2 issue1
A02 P1 issue2

这是我的 .php 文件

<?php
include('functions.php');
//$tipo = $_GET['txtTi'];
$array = array();   
if ($resultset = getSQLResultSet("
    SELECT errors.error_code,
           errors.issue,
           errors.cause,
           errors.solution,
           products.error_code,
           products.product,
           products.issue 
    FROM errors 
    JOIN products
        ON errors .issue = products.issue
            AND errors.error_code = products.error_code
    WHERE errors.error_code = 'A01'")
){
    $p = array();
    $c = array ();
    $s = array();
    while ($row = $resultset->fetch_array(MYSQLI_NUM)){
        $e = array();
        $e['error_code'] = $row[0];
        $e['issue'] = $row[1];
        $c['cause'] = $row[2];
        $e['cause'] = $c;
        $s['solution'] = $row[3];
        $e['solution'] = $s;
        $p['product'] = $row[5];
        $e['products'] = $p;
        array_push($array,$e);
    }
    echo json_encode($array);
}
?>

我有这个 json

[
   {
      "error_code":"A01",
      "issue":"issue1",
      "cause":{
         "cause":"cause1.1"
      },
      "solution":{
         "solution":"solution1.1"
      },
      "products":{
         "product":"P1"
      }
   },
{
      "error_code":"A01",
      "issue":"issue1",
      "cause":{
         "cause":"cause1.2"
      },
      "solution":{
         "solution":"solution1.2"
      },
      "products":{
         "product":"P1"
      }
   },{
      "error_code":"A01",
      "issue":"issue1",
      "cause":{
         "cause":"cause1.3"
      },
      "solution":{
         "solution":"solution1.3"
      },
      "products":{
         "product":"P1"
      }
   },
(...)

]

但这是我想要的 json

[
{
 "error_code":"A01",
 "issue":"issue1",
 "cause":{
         "cause":"cause1.1",
         "cause":"cause1.2",
         "cause":"cause1.3"
          },
 "solution":{
          "solution":"solution1.1",
          "solution":"solution1.2",
          "solution":"solution1.3"
          },
 "products":{
          "product":"P1",
          "product":"P2"
          }
       }
]

【问题讨论】:

  • 您的预期结果中是否涉及数据库关系?如果没有,您可以只获取每个表中的所有行,对吗?
  • 它们由两列相关联(error_code 和 issue) 这种组合在两个表中都不是唯一的。因此,您必须在单独的子查询中获取不同的值对并将其用作基础。
  • @AymDev 他们参与 error_code 和 issue 列,以获得我需要的产品。然后我想检索 json 数组中的所有产品
  • @Akina 单独的子查询是什么意思并将其用作基础?可以举个例子吗?
  • 同一数组级别中不能有重复的键。例如,您不能将 solutionsolution 作为同一子数组中的键。我建议您只制作索引子数组。

标签: php mysql sql json inner-join


【解决方案1】:

我想你可以对你的数据库行进行分组并用逗号分隔它们,以便它们是平坦的,然后在你迭代时解包/分解它们。

SELECT errors.error_code,
       errors.issue,
       GROUP_CONCAT(DISTINCT errors.cause) AS causes,
       GROUP_CONCAT(DISTINCT errors.solution) AS solutions,
       GROUP_CONCAT(DISTINCT products.product) AS products
FROM errors 
JOIN products
    ON errors.issue = products.issue
       AND errors.error_code = products.error_code
WHERE errors.error_code = 'A01'
GROUP BY errors.error_code,
         errors.issue;
error_code issue causes solutions products
A01 issue1 cause1.1,cause1.2,cause1.3 solution1.1,solution1.2,solution1.3 P1,P2
A01 issue2 cause1.4 solution1.4 P4

View on DB Fiddle

$result = [];
while ($row = $resultset->fetch_array(MYSQLI_ASSOC)) {
    $result[] = [
        'error_code' => $row['error_code'],
        'issue' => $row['issue'],
        'causes' => explode(',', $row['causes']),
        'solutions' => explode(',', $row['solutions']),
        'products' => explode(',', $row['products'])
    ];
}
echo json_encode($result);

有几种方法可以做到这一点。以上只是一种方式。

【讨论】:

  • 但如果我这样做,我将有重复的原因、解决方案和产品
  • 我的意思是,我刚试过。而且我有每一个原因和每一个解决方案重复两次。和产品多次。我只想列出存在的多种原因,但不重复
  • 也许这会对你有所帮助 (dbfiddle.uk/…)
  • 好的,我已经调整好了。
【解决方案2】:

查询下一种形式的数据:

SELECT error_code, issue, cause, NULL solution, NULL product
FROM ERRORS
UNION ALL
SELECT error_code, issue, NULL, solution, NULL
FROM ERRORS
UNION ALL
SELECT id_error, issue, NULL, NULL, product
FROM PRODUCTS
ORDER BY error_code, issue, cause IS NULL, solution IS NULL

(请参阅fiddle),然后在您的 PHP 代码中迭代此行集。

PS。由于键名重复,您无法将此数据聚合到 MySQL 上所需的 JSON 中。

【讨论】:

  • 我如何在我的 PHP 代码中迭代它?抱歉,我不懂 PHP :(
  • @CeliaD 我也不使用(因此不知道)它。帮不上忙,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2018-07-07
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多