2011-11-16 6 views
0

Voir la requête SQL ci-dessous, il semble bien fonctionner. Cela me permet de rechercher le disque via le code postal ou la ville.Comment améliorer la requête SQL

Type d'utilisateur dans le code postal ou la ville d'une zone de texte.

Il existe une liste de codes postaux (BB1, BB2, BB3, etc.) du tableau uk_postcodes.

Si l'utilisateur tape BB2 ou BB2 XXX, il affichera alors une liste des enregistrements de la boutique qui font la livraison dans la zone BB2. (J'utilise PHP pour obtenir la première partie du code postal avant de passer en requête SQL)

Si le type d'utilisateur dans Blackburn il affichera la liste des magasins avec zone de livraison par défaut (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')"; 

Est cette requête SQL est-elle bonne? ou ce qui peut être amélioré ou le rendre plus petit?

Répondre

1

Utilisation UNION ALL est plus rapide que l'utilisation de UNION, car il n'est pas nécessaire d'effectuer une vérification distincte. Dans ce cas, à moins que quelqu'un habite dans une ville qui est aussi un code postal, vous n'avez pas besoin de cette surcharge!

1

Vous pouvez utiliser une variable de commande, d'une façon

$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 de $ est déterminée pour la sélection de l'utilisateur actuel

Format est une fonction fictive code ici

// 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; 
} 
Questions connexes