方法1
您可以運行查詢,隨後在同一順序相同的字段,使用UNION
「默認」 查詢。
SELECT ...query1...
UNION
SELECT * FROM (SELECT ... LIMIT 1) AS defaults;
這將始終運行第一查詢和第二查詢,總是會返回比單獨第一查詢將一個結果了。這取決於你,然後放棄最後的結果。
另一種可能性是以相反的順序進行。現在的「空」的結果首先返回:
SELECT * FROM (SELECT ... LIMIT 1) AS defaults;
UNION
SELECT ...query1...
這樣你就可以提取一個元組,再下去就好像你單獨運行第一個查詢。
方法2
在某些情況下,你可以建立與結果優先順序。例如:
SELECT `entry_value` FROM `data` WHERE (`entry_year` = $year AND
`entry_month` = $month) LIMIT 1;
可能成爲:
SELECT `entry_value` FROM `data` ORDER BY
(`entry_year` = $year AND `entry_month` = $month) DESC,
`entry_year` = $year DESC,
ABS(`entry_year` - $year)*12 + ABS(`entry_month` - $month)
LIMIT 1;
這將檢索的所有數據,並且(entry_year = $year AND entry_month = $month)
可以爲真(1)或假(0)。 DESC命令將使它成爲第一行將是完美匹配的那一行。
同樣,在不匹配的行中,如果它存在,則隨機選擇一個與正確年份相同的行。但是如果所需年份中完全沒有數據,則將選擇具有最短時間距離的行。
此方法強烈建議在使用的字段(年和月)上有一個索引,並將掃描所有記錄。所以它可能相當昂貴。
方法3
性能方面,方法1是幾乎同樣的事情,同時運行的查詢,因此,如果可能的話,你寧願做明確的,是這樣的:
// CODE BEFORE MODIFICATION (ran 1 query)
$query = "SELECT...";
// Execute query
foreach ($tuple = SQLFetch($handle)) {
// ...do something with data
}
// CODE AFTER (2 queries - or any number, actually)
$queries = [
"SELECT ...",
"SELECT ... LIMIT 1",
];
foreach ($queries as $query) {
// $query =
// Execute $query
foreach ($tuple = SQLFetch($handle)) {
// ...do something with data
}
if (SQLNumRows($handle) > 0) {
break;
}
}
正如你可以看到,舊代碼實際上保持不變,並且額外的查詢(或多個查詢)僅在其之前的查詢沒有返回任何內容時才被執行。獲取元組和取回元組數的實際指令取決於您使用的實際數據庫接口。