ユーザーは、郵便番号(例:L14、L15、L16)または場所をテキストボックスから検索することができます。結合を回避するためにSQLクエリを改善する別の方法はありますか?
「Liverpool」にユーザーが入力すると、「Liverpool」にあるすべてのお店が検索されます。ユーザーが郵便番号(例:L15)に入力すると、L15の郵便番号帯で配達を行うすべての店舗が検索されます。
mysql> select * from shops;
+----+----------+-----------+----------+
| id | name | location | postcode |
+----+----------+-----------+----------+
| 1 | Shop One | Liverpool | L10 |
| 2 | Shop Two | Liverpool | L16 |
+----+----------+-----------+----------+
-
mysql> select * from shops_delivery_area;
+------------------+---------+----------+---------------+
| delivery_area_id | shop_id | postcode | delivery_cost |
+------------------+---------+----------+---------------+
| 1 | 1 | L10 | 1.50 |
| 2 | 1 | L11 | 0.00 |
| 3 | 1 | L12 | 1.00 |
| 4 | 1 | L13 | 1.00 |
| 5 | 2 | L10 | 2.50 |
| 6 | 2 | L16 | 0.00 |
| 7 | 2 | L28 | 0.00 |
+------------------+---------+----------+---------------+
SQLクエリ:
は以下の表を参照してください
SELECT U.* FROM
((SELECT DISTINCT shops.*, DA.delivery_cost, DA.postcode AS AreaPostcode FROM shops
JOIN shops_delivery_area as DA on (DA.shop_id = shops.id)
WHERE DA.postcode = "Liverpool")
UNION
(SELECT DISTINCT shops.*, DA.delivery_cost, DA.postcode AS AreaPostcode FROM shops
JOIN shops_delivery_area as DA on
(DA.shop_id = shops.id AND
DA.postcode = shops.postcode)
WHERE shops.location = "Liverpool")) as U
-
結果 - 場所(リバプール)によって:
+----+----------+-----------+----------+---------------+--------------+
| id | name | location | postcode | delivery_cost | AreaPostcode |
+----+----------+-----------+----------+---------------+--------------+
| 1 | Shop One | Liverpool | L10 | 1.50 | L10 |
| 2 | Shop Two | Liverpool | L16 | 0.00 | L16 |
+----+----------+-----------+----------+---------------+--------------+
結果 - 郵便番号(L12)によって:
+----+----------+-----------+----------+---------------+--------------+
| id | name | location | postcode | delivery_cost | AreaPostcode |
+----+----------+-----------+----------+---------------+--------------+
| 1 | Shop One | Liverpool | L10 | 1.00 | L12 |
+----+----------+-----------+----------+---------------+--------------+
それが正しく動作するように見える... は改善する他の方法はありますunion
または何かを避けるために短いSQLクエリ?
...句は、あなたのケースの両方をカバーするようだWHEREで、次のOR、言っ
? p.s. UNION DISTINCTの略号であるため、DISTINCTキーワードを削除することができます。 – onedaywhen