简化多个嵌套的MYSQL选择查询

时间:2014-10-24 16:34:24

标签: php mysql

我很难绕过嵌套这些SELECT,以便只使用一个查询来提取我需要的数据!

我需要在composition表中找到并返回一行,该行的最新日期早于loads表中的加载日期。

这可以,但我应该能够在一个查询中完成:

$sql = "SELECT * FROM loads JOIN generators ON gen_key =gen_id ";
$sql.=" WHERE field_id= ".$fieldcode;
$sql.=" ORDER BY load_date DESC,load_time DESC ";
$result=mysqli_query($db_connection,$sql); 
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 
$sql2 = "SELECT * FROM (SELECT * FROM composition WHERE comp_date <=   '".$row[load_date]."'  AND gen_id =".$row[gen_id]." ORDER BY comp_date ASC) as T1 ORDER BY comp_date DESC LIMIT 1";
$result2=mysqli_query($db_connection,$sql2); 
$row2 = mysqli_fetch_array($result2, MYSQLI_ASSOC);
// Output $row[] and $row2[] data
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您希望最小化从PHP到SQL的查询,可以使用存储过程。 基本上他们很快就能绕过你的脑袋。如果你按照这个主题的快速教程,你很快就会去(我刚刚做过): http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

在这种情况下,您最终只需要使用一个或多个参数从PHP到SQL调用一个过程 - 从而大大减少查询。

例如,您可以在存储过程中包含上述SQL调用(或多或少,因为它们代表您的代码),例如$sql = "call getGenerators(".$gen_id.");";,结果将是您在要返回的存储过程中选择的任何内容。

存储过程非常适合在您的情况下获取数据但在执行硬逻辑时效果不佳(这不是)。

希望它有所帮助。