我想知道我是否可以清理这一点,我想做一个嵌套的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)'"
));
这个查询应该可以做到;因为您只查询一个项,所以实际上不需要join:
SELECT `ExternalDomain`,`AccessFile`
FROM `FileServers`
WHERE `ID` IN (SELECT `Server_ID`
FROM `FileServerFiles`
WHERE `File_ID` ='$fileid'
limit 1
);
顺便说一句,我假设$fileid
已经被适当地消毒了;您还可以考虑预处理语句(和/或)。
你可以试试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)"));
这不是嵌套的,而是使用join
语法的等效语法,这种语法有时被认为更简洁(而且更现代,无论如何)。可能不是您想要的,但这里供您参考(因为如果您使用数据库,可能会遇到这种语法)。
INNER JOIN
表示如果在join的右侧没有匹配的行,则从结果中丢弃来自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
语法可能有点不对劲,但左连接应该可以解决问题。情人眼里出西施,但一次查询总比两次好。
$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
"));