将php循环转换为简单的MySQL查询

时间:2014-12-22 18:34:30

标签: php mysql loops

抱歉,如果这是一个愚蠢的问题。谢谢你的时间。我已经四处寻找并发现了类似的问题/答案 - 但还没有找到我正在寻找的东西。

我曾经通过PHP进行所有MySQL调用 - 但最近 - 我已经获得了一个包含5000,000个股票经纪人记录的非常大的数据库表的任务。 PHP我工作正常 - 但需要HOURS才能完成。简单的MySQL调用认为这会快得多......简单的" -ness迷失在​​我身上。

My_Table:

| ID | My_Stockbroker | My_Start_Date | My_End_Date | POST_SIZE |
| 1  |     DAVE       |  2000-06-19   | 2000-06-19  |     2     |
| 2  |     DAVE       |  1999-03-02   | 2002-09-06  |     0     |
| 3  |     DAVE       |  1999-03-14   | 2002-12-10  |     0     |
| 4  |     SAM        |  2000-06-19   | 2000-06-19  |           |

更新目标表为My_Table - 我想更新所有POST_SIZE' values on My_Table`


我的PHP非常简单:

  • POST_SIZE最初为空白
  • 从My_Table =" DAVE"
  • 获取一个My_Stockbroker个名称
  • 从My_Table中计算任何其他记录(不包括正在处理的记录)=" DAVE"并且属于特定日期范围 即 My_TableMy_Start_Date< " ID1"。My_TableMy_Start_Date&& My_TableMy_End_Date> " ID1"。My_TableMy_Start_Date POST_SIZE ++;

我的PHP代码是这样的:

// Get 1 record
$sql = "SELECT `ID`, ` My_Stockbroker`,  `My_Start_Date`, from `".$Table."` WHERE ` My_Stockbroker` != '' AND `POST_SIZE` = '' LIMIT 1"; //

while($row = $result->fetch_assoc()){// while 1 record result
    $ My_Stockbroker_To_Examin_ID = $row["ID"];
    $ My_Stockbroker_To_Examin = $row[" My_Stockbroker"];
    $ My_Stockbroker_To_Examin_My_Start_Date = $row["My_Start_Date"];
}

/////// GET ALL RECORDS FOR SPECIFIC  My_Stockbroker that fall within specific date ///////
$sql = "SELECT `ID` FROM `".$Table."` WHERE `My_Start_Date` < 
'".$My_Stockbroker_To_Examin_My_Start_Date."' AND `My_End_Date` > 
'".$My_Stockbroker_To_Examin_My_Start_Date."' AND `My_Stockbroker` = 
'".$My_Stockbroker_To_Examin."' AND `ID` != '".$ My_Stockbroker_To_Examin_ID ."'"; // 

if($result = $conn->query($sql)){//
   $POST_SIZE = $result->num_rows;
}

// now write back the number of rows found    
$sql = "UPDATE `".$Table."` SET `POST_SIZE` = '".$POST_SIZE."', WHERE `ID` = '".$My_Stockbroker_To_Examin_ID."'; ";

正如我所说 - 我的PHP代码完美无瑕。 我没有时间等待数小时才能完成。

如何才能实现 - 在一张桌子上 - 只使用MySQL?

读取一条记录/计数日期范围内的所有记录/写入值POST_SIZE

我是否需要动态创建一组临时表,并加入等? 或者这可以在MySQL循环中实现吗? MySQL通常更快吗? - 或者我可能会错误地使用我的PHP?

2 个答案:

答案 0 :(得分:1)

您可以在单个查询语句中执行此整个过程,例如

SELECT `ID` 
FROM 
(
SELECT `ID` as MSID, 
`My_Stockbroker` as MSB,  
`My_Start_Date` as MSD
 from My_Table
 WHERE `My_Stockbroker` IS NOT NULL AND `POST_SIZE` IS NULL
 ORDER BY `ID` LIMIT 1
) tab
WHERE `My_Start_Date` < MSD
AND `My_End_Date` > MSD 
AND `My_Stockbroker` = MSB
AND `ID` != MSID;

答案 1 :(得分:1)

我还没有尝试过这个sql,但它应该像

UPDATE My_Table set Post_size = (SELECT COUNT(ID) FROM My_Table 
 WHERE ID <> My_Stockbroker_To_Examin_ID 
 AND My_Start_Date < My_Stockbroker_To_Examin_My_Start_Date 
 AND My_End_Date > My_Stockbroker_To_Examin_My_Start_Date 
 AND My_Stockbroker = My_Stockbroker_To_Examin)

您可以使用所需的值替换这些变量。