问题描述
我有三个表:
表1
id title name user token
1 supermarket big market [email protected] aaaaa
2 hear styler stylist [email protected] bbbbb
表2
id country city user token
1 USA New York [email protected] aaaaa
2 UK London [email protected] bbbbb
table3
id url user token
1 uploadPic/image1.jpg [email protected] aaaaa
2 uploadPic/image2.jpg [email protected] aaaaa
3 uploadPic/image3.jpg [email protected] bbbbb
4 uploadPic/image4.jpg [email protected] bbbbb
5 uploadPic/image5.jpg [email protected] bbbbb
6 uploadPic/image6.jpg [email protected] bbbbb
然后我使用INNER JOIN将表合并到一起:
$response['info'] = array();
$sql = "SELECT * FROM `table1` as tb1
INNER JOIN `table2` as tb2 ON tb1.token = tb2.token
INNER JOIN table3 as tb3 ON tb3.token = tb1.token
ORDER BY tb1.id DESC";
$run = $connect->prepare($sql);
$run->execute();
$record = $run->fetchAll(PDO::FETCH_ASSOC);
$response['info'] = $recordAdvert;
echo json_encode($response,JSON_PRETTY_PRINT);
结果是:
{
"info": [
{
"id": "6","title": "superMarket","name": "big market","user": "[email protected]","token": "bbbbb","country": "UK","city": "London","url": "uploadPic/image2.jpg"
},{
"id": "5","url": "uploadPic/image1.jpg"
},{
"id": "4","url": "uploadPic/image6.jpg"
},{
"id": "3","title": "hear styler","name": "stylist","user": "[email protected]","token": "aaaaa","country": "USA","city": "NEW YORK","url": "uploadPic/image5.jpg"
},{
"id": "2","url": "uploadPic/image4.jpg"
},{
"id": "1","url": "uploadPic/image3.jpg"
}
]
}
但这不是我想要的。只能有两行,因为我只有两个用户和两个令牌,所以我想将图像限制为1个,但是我不能因为当我在图像表中使用limit将两个用户的图像限制为一个而限制时总表。 结果必须是这样的:
{
"advert": [
{
"id": "2","url": "uploadPic/image3.jpg"
},"title": "supermarket","city": "New york","url": "uploadPic/image1.jpg"
}
]
}
我这样编辑选择查询:
$sql = "SELECT * FROM `table1` as tb1
INNER JOIN `table2` as tb2 ON tb1.token = tb2.token
INNER JOIN (SELECT * FROM table3 LIMIT 1) as tb3 ON tb3.token = tb1.token
ORDER BY tb1.id DESC";
但是它限制了总行,而不仅仅是表3行。
{
"info": [
{
"id": "6","url": "uploadPic/image2.jpg"
}
]
}
解决方法
您可以使用关联的子查询,该子查询使用LIMIT
来获取每个用户一个URL。
SELECT t1.id,t1.title,t1.name,t1.user,t1.token,t1.country,t2.city,(SELECT t3.url
FROM table3 t3
WHERE t3.token = t1.token
ORDER BY t3.id DESC
LIMIT 1) url
FROM table1 t1
INNER JOIN table2 t2
ON t2.token = t1.token
ORDER BY t1.id DESC;