【问题标题】:display 2 id's in json response在 json 响应中显示 2 个 id
【发布时间】:2018-02-10 05:29:56
【问题描述】:

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

如何在回复中同时显示 users.idsubject.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"
}

【问题讨论】:

    标签: php mysql json pdo


    【解决方案1】:

    要解决包含两个 id 列的结果集的问题,请将主题 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 Nah...为 Gordon Linoff 或 Jon Skeet 保存“完美”。我只是在这里工作。
    • @AlivetoDie Nah...为 Gordon Linoff 或 Jon Skeet 保存“完美”。我只是在这里工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多