2012-01-04 79 views
0

我有一個頁面每隔10秒刷新一次以檢查用戶是否有郵件或警報。php結合了多個sql查詢

我有兩個查詢一個接一個。

$sql_result7 = mysql_query("SELECT date FROM alerts WHERE to_id='$id' AND date > '$lastcheck'", $db); 
$alerts = mysql_num_rows($sql_result7); 
$rs7 = mysql_fetch_array($sql_result7); 
$last_alert = $rs7[date]; 

$sql_result7 = mysql_query("SELECT date FROM mobmail WHERE to_id='$id' AND read = '0'", $db); 
$mails = mysql_num_rows($sql_result7); 
$rs7 = mysql_fetch_array($sql_result7); 
$last_mail_alert = $rs7[date]; 

是否有可能通過將其組合到一個查詢中來保存到數據庫的行程?有什麼需要嗎?

+0

這些SQL語句實際上可能會失敗,因爲您沒有提供'ORDER BY'子句,默認情況下您可能會按照升序(最後的最新日期)返回它們,但沒有保證。 – Rudu 2012-01-04 20:23:20

回答

1

爲什麼只使用聯合?

SELECT date 
FROM alerts where... 
UNION 
SELECT date 
FROM mobmail where... 

如果你想重複利用...... UNION ALL

1

您可以使用UNION做吧..基本上把第二個查詢後先用UNION之間。

對於這裏的任何東西,除了to_id之外,您似乎都沒有看到JOIN,但您並沒有真正從中獲益。這幾乎是一個交叉連接,這將是不必要的低效率。

1

爲什麼不直接使用工會和MAX aggregate命令......

SELECT max(date) lastdate,'alert' dtype FROM alerts WHERE .. GROUP BY to_id 
UNION 
SELECT max(date) lastdate,'mail' dtype FROM mobmail WHERE ... GROUP BY to_id 

現在,您會只需要一個SQL查詢,並減少PHP端的處理:

$sql_result7=mysql_query(/* as above with your params*/); 
$res=mysql_fetch_array($sql_result7); 
$last_alert=$last_mail=null; 
foreach ($res as $row) { 
    if ($row['dtype']=="alert") { 
     $last_alert=$row['lastdate']; 
    } elseif ($row['dtype']=="mail") { 
     $last_mail=$row['lastdate']; 
    } 
} 

。或者是那種效果(我不能輕易測試;))。