【问题标题】:How to produce a valid json output from multiple MySQL tables如何从多个 MySQL 表中生成有效的 json 输出
【发布时间】:2018-03-14 15:00:51
【问题描述】:

我在本地服务器中使用 phpMyAdmin 创建了一个 mySQL 数据库。在这个数据库中,我存储了我朋友的名字和最喜欢的 NBA 球队。这显然是一个多对多的关系。出于这个原因,我创建了三个表:一个包含我朋友的 id 和名称,一个包含团队的 id 和名称,另一个包含 friends_id 和 teams_id(这是关系表)。下面的 MySQL 脚本更清楚地表明了这一点:

CREATE TABLE `friends` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE `teams` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE `relations` (
  `friends_id` int(4) NOT NULL AUTO_INCREMENT,
  `teams_id` int(4) NOT NULL AUTO_INCREMENT,
)

我想用这些数据给出一个 json 输出,因此我运行以下 PHP 脚本:

<?php

$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
$arr = [];
if ($resultCheck > 0) {
   while ($row = mysqli_fetch_assoc($result)) {
        $arr[] = $row; 
   }
} 
echo json_encode($arr, JSON_PRETTY_PRINT);

$sql = 'SELECT * FROM teams;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
$arr = [];
if ($resultCheck > 0) {
   while ($row = mysqli_fetch_assoc($result)) {
        $arr[] = $row; 
   }
} 
echo json_encode($arr, JSON_PRETTY_PRINT);

$sql = 'SELECT * FROM relations;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
$arr = [];
if ($resultCheck > 0) {
   while ($row = mysqli_fetch_assoc($result)) {
        $arr[] = $row; 
   }
} 
echo json_encode($arr, JSON_PRETTY_PRINT);
?>

然而,这并没有给出一个有效的 json 输出,而是三个不同的 json 数组。例如,像这样:

[..., 
{
        "id": "3",
        "name": "David Belton",
    },
...]

[..., 
{
        "id": "4",
        "name": "Boston Celtics",
    },
...]

[..., 
{
        "friends_id": "3",
        "teams_id": "4"
    },
...]

如何打印所有具有有效 json 输出的表?

【问题讨论】:

标签: php mysql json


【解决方案1】:

因为这个问题与How to join arrays with MySQL from 3 tables of many-to-many relationship 有关,所以我只发布了一个 MySQL 答案。

查询

SELECT
  CONCAT(
      "["
    , GROUP_CONCAT(json_records.json)
    , "]"
  )  AS json
FROM (

  SELECT 
     CONCAT(
       "{"
     ,     '"id"' , ":" , '"' , friends.id , '"' , ","
     ,     '"name"' , ":" , '"' , friends.name , '"' , ","
     ,     '"team"' , ":" , "["
                              , GROUP_CONCAT('"', teams.name, '"')
                          , "]"
     , "}"
     ) AS json 
  FROM 
    friends 
  INNER JOIN 
    relations 
  ON 
    friends.id = relations.friends_id
  INNER JOIN
    teams 
  ON
    relations.teams_id = teams.id
  WHERE 
    friends.id IN(SELECT id FROM friends) #select the friends you need
  GROUP BY
     friends.id
) 
 AS json_records

结果

|                                                                                                                                             json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |

演示

http://www.sqlfiddle.com/#!9/4cd244/61

【讨论】:

  • 不要冒犯@Raymond,但我认为这与我的宝贵职位没有直接关系。因为最后我想打印连接表,但也要单独打印团队表。所以我想再打印一张以上的桌子。
【解决方案2】:

您不需要编写多个 sql 查询来检索它。您可以执行以下操作

<?php
$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends INNER JOIN relations ON friends.id=relations.friends_id
INNER JOIN teams ON relations.teams_id=teams.id';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
$arr = [];
if ($resultCheck > 0) {
   while ($row = mysqli_fetch_assoc($result)) {
        $arr[] = $row; 
   }
} 
echo json_encode($arr, JSON_PRETTY_PRINT);
?>

【讨论】:

  • 由于某种原因出现以下错误&lt;br /&gt; &lt;b&gt;Warning&lt;/b&gt;: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in &lt;b&gt;/opt/lampp/htdocs/index.php&lt;/b&gt; on line &lt;b&gt;17&lt;/b&gt;&lt;br /&gt;
  • 此行$resultCheck = mysqli_num_rows($result);
  • 你能分享一下你的表结构吗?
  • 好的。你确定SELECT CONVERT(varchar(30), friends_id)中的friends_id吗?
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多