Как улучшить SQL-запрос - PullRequest
0 голосов
/ 16 ноября 2011

См. SQL-запрос ниже, похоже, он работает хорошо. Это позволяет мне искать записи по почтовому индексу или городу.

Пользователь вводит почтовый индекс или город из текстового поля.

Существует список почтовых индексов (BB1, BB2, BB3 и т. Д.) Из таблицы uk_postcodes.

Если пользователь введет 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 хорош? или что можно улучшить или уменьшить?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Использование UNION ALL выполняется быстрее, чем использование UNION, так как отдельная проверка не требуется.В этом случае, если кто-то не живет в городе с таким же почтовым индексом, вам не нужны эти накладные расходы!

1 голос
/ 16 ноября 2011

Вы можете использовать одну переменную управления, например, как

$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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...