在 PHP 中使用多个条件访问嵌套的 MySQL Select。

Posted

技术标签:

【中文标题】在 PHP 中使用多个条件访问嵌套的 MySQL Select。【英文标题】:Accessing nested MySQL Select with multiple conditions in PHP. 【发布时间】:2016-03-25 22:46:16 【问题描述】:

我想从一个表中选择符合某些条件的数据,然后根据我刚刚选择的数据的条件从另一个表中选择数据,并且能够查看两个表中的选择。我尝试使用嵌套选择:

$query = 
"
SELECT 
    `url`, `userID`, `likes`, `time`, `latitude`, `longitude`, `distance `,
    (SELECT `up` from userHistory WHERE userHistory.url = photoList.url AND userHistory.userID = photoList.userID)
FROM 
    photoList 
WHERE 
    `valid` = '1' AND `time` > '$validTime' AND `likes` > '-6' 
HAVING 
    `distance` < '1'
ORDER BY 
    `time` DESC 
LIMIT 
    '0' , '200'";

基本上我想在 photoList 中选择一个对象...然后在 userHistory 中选择匹配所选 photoList 行中的 url 和 userID。我想同时选择这两个,这样当我在 php 中循环时,我可以执行以下操作:

while ($row = $result->fetch_assoc())
        $storeObjects[] = array("url" => $row["url"], "userID" => $row["userID"],
        "latitude" => $row["latitude"], "longitude" => $row["longitude"],
        "likes" => $row["likes"],
        "time" => $row["time"], "distance" => $row["distance"], 
        "userLiked" => $row["up"]); //$row["up"] is ALWAYS NULL

在上述循环中,$row["up"] 始终为 NULL,而行中的其他类别是预期值。我想知道 $row["up"] 是否是访问子查询选择的数据的正确方法。

【问题讨论】:

【参考方案1】:

您可以JOIN 2个表如下:

SELECT p.`url`, p.`userID`, p.`likes`, p.`time`, p.`latitude`,
p.`longitude`, p.`distance`, u.`up`
FROM photoList p
JOIN userHistory u
ON u.`url` = p.`url`
AND u.`userID` = p.`userID`
WHERE p.`valid` = '1'
AND p.`time` > '$validTime'
AND p.`likes` > '-6' 
HAVING p.`distance` < '1'
ORDER BY p.`time` DESC
LIMIT 0, 200

【讨论】:

谢谢!完全按照需要工作。【参考方案2】:

您可以使用NATURAL JOIN 来连接两个具有共同属性的表,如下所示:

SELECT url, userID, likes, time, latitude, longitude, distance, up
FROM photoList
NATURAL JOIN userHistory
WHERE valid = 1 AND time > '$validTime' AND likes > -6 AND distance < 1
ORDER BY time DESC
LIMIT 0, 200

【讨论】:

您的查询将引发错误提示“列不明确urluserID”。 因为urluserID 列存在于photoListuserHistory 两个表中。所以在SELECT子句中我们需要指定表或别名。 @Samir 自然连接删除了相等比较中涉及的重复列,因此每个比较列中只剩下 1 个。见this answer。 哦,我的错。没有注意到自然加入。

以上是关于在 PHP 中使用多个条件访问嵌套的 MySQL Select。的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的 foreach 循环使用 if 条件创建重复记录 - PHP Laravel 8

mysql 多个条件的删除一条记录的语句

sqlwhere后可以有多个条件后再嵌套吗

在条件动态过滤的选择位置中嵌套“ifs”

具有多个条件的 PHP MySQL 搜索

在多个表上进行条件 mysql 连接的最有效方法? (Yii php 框架)