每当我将 subjects.id
添加到查询中的选择时,
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
列的结果集的问题,请为主题 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
表,但是在这个新连接之后该表已减少为仅包含具有最新消息时间的记录。这里有一个警告:如果您对最近的消息有领带,我的查询将返回所有此类领带。我们可以解决这个问题,但这需要更多工作。
关于php - 在 json 响应中显示 2 个 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45995331/