簡體   English   中英

如何改進SQL查詢

[英]How to improve SQL query

請參閱下面的SQL查詢,它似乎運行良好。 它允許我通過郵政編碼或城鎮搜索記錄。

用戶在文本框中輸入郵政編碼或城鎮。

uk_postcodes表中有一個Postcodes列表(BB1,BB2,BB3等)。

如果用戶鍵入BB2或BB2 XXX,則會顯示在BB2區域中傳送的商店記錄列表。 (在進入SQL查詢之前,我使用PHP獲取郵政編碼的第一部分)

如果用戶在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查詢好嗎? 或者可以改進什么或使其變小?

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

$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;
}

使用UNION ALL比使用UNION更快,因為不需要進行明確的檢查。 在這種情況下,除非有人住在一個​​也是郵政編碼的城鎮,否則你不需要這筆費用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM