将三个表联接在一起并限制一口渴表-PDO

问题描述

我有三个表:

表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;