简体   繁体   English

如何减少多个依赖查询

[英]How to reduce multiple dependent queries

I was wondering if i can clean this up a bit, i wanted to make a nested sql statement but am unsure how. 我想知道我是否可以清理一下这个,我想做一个嵌套的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']."'"));

i wanted something like this? 我想要这样的东西?

    $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)'"
    ));

This query should do it; 这个查询应该这样做; since you're only querying one item, you don't really need a join: 因为你只是查询一个项目,所以你真的不需要加入:

SELECT `ExternalDomain`,`AccessFile` 
FROM `FileServers` 
WHERE `ID` IN (SELECT `Server_ID` 
    FROM `FileServerFiles` 
    WHERE `File_ID` ='$fileid' 
    limit 1
);

Btw, I've assumed that $fileid has been properly sanitized; 顺便说一下,我假设$fileid已经过适当的消毒; you could also consider prepared statements (and/or). 你也可以考虑准备好的陈述(和/或)。

你可以试试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)"));

This is not nested, but is an equivalent using the join syntax, which is sometimes considered more concise (and modern, for what that's worth). 这不是嵌套的,而是使用join语法的等价物,有时候它被认为更简洁(现代,更值得)。 May be not what you want, but here for your reference (as you're likely to come up against this syntax if you're working with databases). 可能不是你想要的,但这里供你参考(如果你正在使用数据库,你可能会遇到这种语法)。

The INNER JOIN means that rows from the left side of the join are discarded from the result if there's no row matched on the right side of the join. INNER JOIN意味着如果在连接的右侧没有匹配行,则从结果中丢弃连接左侧的行。

I've added heaps of white space so it's clear, feel free to strip that out. 我已经添加了大量的空白区域,所以它很清楚,随意将其剥离。 But no need to. 但没必要。

$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
   "));

As mentioned by @Jack before me, you should ensure $fileid is sanitized. 正如@Jack在我之前提到的那样,你应该确保$fileid被清理。 Refer http://en.wikipedia.org/wiki/SQL_injection 请参阅http://en.wikipedia.org/wiki/SQL_injection

Syntax may be just abit off, but a left join should do the trick. 语法可能只是abit off,但左连接应该可以解决问题。 Shorter is in the eye of the beholder, but one query is better than 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
  "));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM