我想知道我是否可以清理一下这个,我想做一个嵌套的sql语句,但我不确定如何。
$serverfile = mysqli_fetch_array(mysqli_query($link,"SELECT `Server_ID`
FROM `FileServerFiles`
WHERE `File_ID` ='$fileid'
limit 1"));
$server = mysqli_fetch_array(mysqli_query($link,"SELECT `ExternalDomain`,`AccessFile`
FROM `FileServers`
WHERE `ID` ='".$serverfile['Server_ID']."'"));
我想要这样的东西?
$server = mysqli_fetch_array(mysqli_query($link,"SELECT `ExternalDomain`,`AccessFile`
FROM `FileServers`
WHERE `ID` ='(SELECT `Server_ID`
FROM `FileServerFiles`
WHERE `File_ID` ='$fileid'
limit 1)'"
));
答案 0 :(得分:2)
这个查询应该这样做;因为你只是查询一个项目,所以你真的不需要加入:
SELECT `ExternalDomain`,`AccessFile`
FROM `FileServers`
WHERE `ID` IN (SELECT `Server_ID`
FROM `FileServerFiles`
WHERE `File_ID` ='$fileid'
limit 1
);
是的,我认为$fileid
已经过适当的消毒;你也可以考虑准备好的陈述(和/或)。
答案 1 :(得分:1)
你可以试试IN,
$server = mysqli_fetch_array(mysqli_query($link,"SELECT `ExternalDomain`,`AccessFile` FROM `FileServers` WHERE `ID` IN (SELECT `Server_ID` AS ID FROM `FileServerFiles` WHERE `File_ID` ='$fileid' limit 1)"));
答案 2 :(得分:0)
这不是嵌套的,而是使用join
语法的等效语法,有时候它被认为更简洁(现代,更值得)。可能不是你想要的,但这里供你参考(如果你正在使用数据库,你可能会遇到这种语法)。
INNER JOIN
表示如果在连接的右侧没有匹配行,则会从结果中丢弃连接左侧的行。
我已经添加了大量的空白区域,因此很清楚,随意将其剥离。但没必要。
$server = mysqli_fetch_array(mysqli_query($link,
"SELECT
fs.ExternalDomain,
fs.AccessFile
FROM
FileServers fs
INNER JOIN FileServerFiles fsf
ON fs.fileid = fsf.server_id
WHERE
fsf.File_ID ='$fileid'
LIMIT 1
"));
正如我之前提到的@Jack所说,你应该确保$fileid
被消毒。请参阅http://en.wikipedia.org/wiki/SQL_injection
答案 3 :(得分:-2)
语法可能有点偏,但左连接应该可以解决问题。较短的是旁观者的眼睛,但一个查询优于2。
$serverfile = mysqli_fetch_array(mysqli_query($link,"
SELECT f.`Server_ID`, s.`ExternalDomain`, s.`AccessFile`
FROM `FileServerFiles` f
LEFT JOIN `FileServers` AS s ON s.`ID` = f.`Server_ID`
WHERE f.`File_ID` ='$fileid'
LIMIT 1
"));