2016-03-01 40 views
1

我有这3个查询,我必须让他们很多次(一个给定月的每一天)。这需要很多时间。避免创建临时表/做一个“本地左连接”PHP MySQL

$sqldia = "CREATE TEMPORARY TABLE today AS (SELECT * FROM booking WHERE day = ".$weekday.")"; 
$sqldia2 = "CREATE TEMPORARY TABLE taken AS (SELECT * FROM b_users WHERE date = '".$date."')"; 
$sqldia3 = "SELECT A.from, A.to FROM today A LEFT JOIN turnostomados B ON A.from = B.to WHERE B.confirmed IS NULL"; 

查询没问题,代码正常工作,但速度很慢。这需要快速查询,并且不会占用太多资源,因为它可以在很短的时间内使用很多次。

我该如何改进? 有什么办法可以在PHP中进行“本地左连接”?

+2

你是如何使用'taken'临时表?第三个查询可以用'booking'和'turnostomados'之间的'join'重写,并添加适当的where规则 - 不需要第一个临时表(可能是第二个)... – sgeddes

+0

请添加PHP代码将这些声明称为不同的日期。有可能是*所有*可以用一个SQL语句替换。 – trincot

回答

0

首先,你不需要临时表(特别是第2一个,因为它根本不使用):

SELECT 
A.from, A.to 
FROM booking as A 
LEFT JOIN 
turnostomados as B 
ON (A.from = B.to) 
WHERE A.day = ".$weekday." 
AND B.confirmed IS NULL 

然后运行explain extended找出执行计划,并添加适当的索引这些两个表

可能你需要在预订(day, from, to)

0

Asumming通过turnostomados你的意思是taken,你刚才忘了把它翻译指数...那么你只需要一个查询:

$sql = "SELECT A.from, A.to FROM booking A LEFT JOIN b_users B ON A.from = B.to 
WHERE B.confirmed IS NULL AND A.day = ".$weekday." AND B.date = '".$date."'" 

同时,确保$weekday$date正确消毒,否则你很容易受到SQL注入。