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。我只是在这里工作。