2016-03-01 45 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注入。