Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 显示2个id';json响应中的s_Php_Mysql_Json_Pdo - Fatal编程技术网

Php 显示2个id';json响应中的s

Php 显示2个id';json响应中的s,php,mysql,json,pdo,Php,Mysql,Json,Pdo,每当我将subjects.id添加到查询中的select时,subjects.id将覆盖JSON响应中的users.id 如何在响应中同时显示users.id和subject.id $sql = "SELECT users.id,users.name,users.date,subjects.id FROM tb_user AS users INNER JOIN tb_subjects AS subjects ON users.id = subjects.userid WHERE

每当我将
subjects.id
添加到查询中的select时,
subjects.id
将覆盖JSON响应中的
users.id

如何在响应中同时显示
users.id
subject.id

    $sql = "SELECT users.id,users.name,users.date,subjects.id FROM tb_user AS users INNER JOIN 
   tb_subjects AS subjects ON users.id = subjects.userid WHERE users.id = '$userid'";

    try {
        $db = new db();
        $db = $db->connect();
        $stmt = $db->prepare($sql);

        $stmt->execute();

        $user = $stmt->fetch(PDO::FETCH_OBJ);

        $db = null;

        if(empty($user)) {
            $response->getBody()->write
            ('
            {
                "error":
                {
                    "message":"Invalid"
                }
            }');
        } else {
            $response->getBody()->write(json_encode($user));
        }
    } catch(PDOException $e) {}
电流输出

{
"id": "1",
"name": "joe",
"date": "2017-07-22 18:37:37"
}
{
"id": "1",
"name": "joe",
"subjectid": "4",
"date": "2017-07-22 18:37:37"
}
预期产出

{
"id": "1",
"name": "joe",
"date": "2017-07-22 18:37:37"
}
{
"id": "1",
"name": "joe",
"subjectid": "4",
"date": "2017-07-22 18:37:37"
}

要解决具有两个
id
列的结果集的问题,请为subject id列指定一个别名
subjectid

SELECT
    users.id,
    users.name,
    users.date,
    subjects.id AS subjectid
FROM tb_user AS users
INNER JOIN tb_subjects AS subjects
    ON users.id = subjects.userid
WHERE users.id = '$userid'
大多数数据库似乎都允许结果集具有两个同名列。但如果它发生在您试图同时选择该重复列的子查询中,则该操作将失败。看起来PHP只是决定选择一个
id
列,不过这里最好的办法是修复查询中的重复名称问题

编辑:

如果您想获取最新的主题,如其
time
列所示,您可以稍微修改查询以使用另一个联接:

SELECT
    users.id,
    users.name,
    users.date,
    s1.id AS subjectid
FROM tb_user AS users
INNER JOIN tb_subjects s1
    ON users.id = s1.userid
INNER JOIN
(
    SELECT userid, MAX(time) AS max_time
    FROM tb_subjects
    GROUP BY userid
) s2
    ON s1.userid = s2.userid AND
       s1.time   = s2.max_time     
WHERE users.id = '$userid'

新联接中的子查询查找每个用户的最新时间。但这仍然没有给我们真正想要的主题
id
。为了实现这一点,我们可以访问第一个
tb_subjects
表,但是在这个新的连接之后,该表被缩减为仅包含最新消息时间的记录。这里有一个警告:如果您对最近的消息有一个联系,我的查询将返回所有这些联系。我们可以解决这个问题,但这需要更多的工作。

要解决结果集有两个
id
列的问题,请为subject id列指定一个别名
subjectid

SELECT
    users.id,
    users.name,
    users.date,
    subjects.id AS subjectid
FROM tb_user AS users
INNER JOIN tb_subjects AS subjects
    ON users.id = subjects.userid
WHERE users.id = '$userid'
大多数数据库似乎都允许结果集具有两个同名列。但如果它发生在您试图同时选择该重复列的子查询中,则该操作将失败。看起来PHP只是决定选择一个
id
列,不过这里最好的办法是修复查询中的重复名称问题

编辑:

如果您想获取最新的主题,如其
time
列所示,您可以稍微修改查询以使用另一个联接:

SELECT
    users.id,
    users.name,
    users.date,
    s1.id AS subjectid
FROM tb_user AS users
INNER JOIN tb_subjects s1
    ON users.id = s1.userid
INNER JOIN
(
    SELECT userid, MAX(time) AS max_time
    FROM tb_subjects
    GROUP BY userid
) s2
    ON s1.userid = s2.userid AND
       s1.time   = s2.max_time     
WHERE users.id = '$userid'

新联接中的子查询查找每个用户的最新时间。但这仍然没有给我们真正想要的主题
id
。为了实现这一点,我们可以访问第一个
tb_subjects
表,但是在这个新的连接之后,该表被缩减为仅包含最新消息时间的记录。这里有一个警告:如果您对最近的消息有一个联系,我的查询将返回所有这些联系。我们可以解决这个问题,但需要更多的工作。

完美答案+1@AlivetoDie不…把“完美”留给戈登·林诺夫或乔恩·斯基特。我只是在这里工作。@AlivetoDie不……把“完美”留给Gordon Linoff或Jon Skeet。我只是在这里工作。完美答案+1@AlivetoDie不…把“完美”留给戈登·林诺夫或乔恩·斯基特。我只是在这里工作。@AlivetoDie不……把“完美”留给Gordon Linoff或Jon Skeet。我只是在这里工作。