如何减少多个依赖查询

时间:2013-04-23 11:15:11

标签: php mysql

我想知道我是否可以清理一下这个,我想做一个嵌套的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)'"
    ));

4 个答案:

答案 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
  "));