2011-11-16 55 views
0

查看下面的SQL查詢,它似乎運行良好。它允許我通過郵編或城鎮搜索記錄。如何改進SQL查詢

用戶輸入郵編或城市從文本框中。

uk_postcodes表中有郵編列表(BB1,BB2,BB3等)。

如果用戶輸入BB2或BB2 XXX,它將顯示一個在BB2區域發貨的店鋪記錄列表。 (我用PHP來獲得郵政編碼的第一部分,它進入SQL查詢之前)

如果Blackburn用戶類型,那麼它會顯示與默認送達地區的商店名單(D.shop_id = S.shop_id AND D.postcode_id = S.postcode_id

$SQL = "(SELECT DISTINCT S.*, D.delivery_cost, D.postcode AS DeliveryAreaPostcode FROM shops AS S 
       JOIN shop_delivery_area AS D ON D.shop_id = S.shop_id 
       JOIN uk_postcodes AS P ON P.postcode_id = D.postcode_id 
        WHERE P.postcode = '$search' ORDER BY D.postcode) 
       UNION 
    (SELECT DISTINCT S.* , D.delivery_cost, D.postcode AS DeliveryAreaPostcode FROM shops AS S 
       JOIN shop_delivery_area AS D ON D.shop_id = S.shop_id AND D.postcode_id = S.postcode_id 
       JOIN uk_postcodes AS P ON P.postcode_id = D.postcode_id 
        WHERE S.town = '$search')"; 

是這個SQL查詢很好?或者什麼可以改進或使其變小?

回答

1

使用UNION ALL是因爲不需要完成獨特的檢查,所以比使用UNION更快。 在這種情況下,除非有人住在同樣也是郵編的小鎮,否則你不需要那些開銷!

1

您可以使用一個控制變量,一些

$SQL = "SELECT DISTINCT S.*, D.delivery_cost, D.postcode AS DeliveryAreaPostcode 
     FROM shops AS S 
      JOIN shop_delivery_area AS D ON D.shop_id = S.shop_id 
      JOIN uk_postcodes AS P ON P.postcode_id = D.postcode_id 
     WHERE (P.postcode = '{0}' and '{1}' = 'postcode') 
     or (S.town = '{0}' and D.postcode_id = S.postcode_id and '{1}' = 'town') 
      ORDER BY D.postcode".format($search, $myflagcontrol); 

$ myflagcontrol是如何確定的當前用戶選擇

格式是這裏的虛擬函數代碼

// Add format extension to string class 
String.prototype.format= function(){  
var str = this; 
for (var i = 0, l = arguments.length; i < l; i++) 
    str = str.replace("{" + i + "}", arguments[i]); 
return str; 
}