2012-02-10 18 views
2

は、以下のSQLクエリを考えてみましょう:複製問題

SELECT DISTINCT shops.*, 
     DA.delivery_cost, 
     DA.postcode 
FROM shops 
     JOIN shops_delivery_area as DA on DA.shop_id = shops.id 
WHERE DA.postcode = "Liverpool" 
     OR location = "Liverpool" 

shopsテーブルテーブル

+------------------+---------+----------+---------------+ 
| delivery_area_id | shop_id | postcode | delivery_cost | 
+------------------+---------+----------+---------------+ 
|    1 |  1 | L10  |   0.00 | 
|    2 |  1 | L11  |   0.00 | 
|    3 |  1 | L12  |   1.00 | 
|    4 |  1 | L13  |   1.00 | 
|    5 |  2 | L10  |   0.00 | 
|    6 |  2 | L16  |   0.00 | 
|    7 |  2 | L28  |   0.00 | 
+------------------+---------+----------+---------------+ 

ユーザーは郵便番号(例:L14L15L16)で検索することができます

+----+----------+-----------+----------+ 
| id | name  | location | postcode | 
+----+----------+-----------+----------+ 
| 1 | Shop One | Liverpool | L10  | 
| 2 | Shop Two | Liverpool | L16  | 
+----+----------+-----------+----------+ 

shops_delivery_areaをまたは場所をテキストボックスから選択します。

「Liverpool」にユーザーが入力すると、「Liverpool」にあるすべてのお店が検索されます。問題は、ショップ名(店舗テーブル)の重複した行があることです。この問題を解決するには?

結果(所在地で検索):お店の名前の重複を避けるために、どのように

私が行う必要があります。shops.id = shops_delivery_area.shop_id AND shops.postcode = shops_delivery_area.postcode

+----+----------+-----------+----------+---------------+----------+ 
| id | name  | location | postcode | delivery_cost | postcode | 
+----+----------+-----------+----------+---------------+----------+ 
| 1 | Shop One | Liverpool | L10  |   0.00 | L10  | 
| 1 | Shop One | Liverpool | L10  |   0.00 | L11  | 
| 1 | Shop One | Liverpool | L10  |   1.00 | L12  | 
| 1 | Shop One | Liverpool | L10  |   1.00 | L13  | 
| 2 | Shop Two | Liverpool | L16  |   0.00 | L10  | 
| 2 | Shop Two | Liverpool | L16  |   0.00 | L16  | 
| 2 | Shop Two | Liverpool | L16  |   0.00 | L28  | 
+----+----------+-----------+----------+---------------+----------+ 

結果(郵便番号L10で検索): 作業罰金を期待

+----+----------+-----------+----------+---------------+----------+ 
| id | name  | location | postcode | delivery_cost | postcode | 
+----+----------+-----------+----------+---------------+----------+ 
| 1 | Shop One | Liverpool | L10  |   0.00 | L10  | 
| 2 | Shop Two | Liverpool | L16  |   0.00 | L10  | 
+----+----------+-----------+----------+---------------+----------+ 
+0

店名に基づいてグループを追加してください。 –

+0

@ GauravVashishtha慎重にクエリを見て、私は 'DISTINCT'を持っています –

+0

DISTINCTはGROUP BYとは異なります。 DISTINCTは異なる行のみを返します(すべての値が異なる必要があります)。GROUP BYは、グループ化するフィールドに異なる値を持つ行を返します。たとえば、shopnameでグループ化すると、異なるショップ名の行のみが表示されます。ただし、delivery_costフィールドとpostcodeフィールドでは、AGGREGATE関数を使用する必要があります。 MAX(delivery_cost) –

答えて

0

私はそれを動作させることができました。私はこの問題を解決するためにUNIONを使用しました。

SELECT U.* FROM 
    ((SELECT DISTINCT shops.*, DA.delivery_cost, DA.postcode AS AreaPostcode FROM shops 
      JOIN shops_delivery_area2 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_area2 as DA on DA.shop_id = shops.id AND DA.postcode = shops.postcode 
    WHERE shops.location = "Liverpool")) as U 

とにかくこのコードを短縮したり改善したりする場合は、教えてください。ありがとう

0

ように "結果場所によって" あなたは "delivery_cost" を持っていますと "郵便番号"は、これらの異なる場合は、常に "重複"は、これらの2つを削除し、それぞれのいずれかが表示されます。

編集: これらのフィールドは、店舗に必要なデフォルト値でフィルタリングする必要がある場合にも必要です。 「delivery_cost」と「postcode」のすべての結果が必要だが、1つの結果だけが必要な場合は、何をしようとしているのかを再考するか、それが期待している結果を説明する必要があります。

+0

はいわかりましたが、私はそれらの2つのフィールドが必要です。 –

+0

@ user791022あなたが提供した例のような重複がある場合、delivery_costとpostcodeにはどのような値を含めるべきですか? –

+0

@AdityaNaidu Locationで検索する場合、 'stores.id = stores_delivery_area.shop_id ANDショップを使用する必要があります。postcode = stores_delivery_area.postcode' –

0
SELECT shops.*, 
MIN(DA.delivery_cost), 
MIN(DA.postcode) 
FROM shops 
JOIN shops_delivery_area as DA on 
     (DA.shop_id = shops.id AND shops.postcode = DA.postcode) 
WHERE DA.postcode = "Liverpool" 
     OR location = "Liverpool" 
GROUP BY shops.location, shops.name, shops.id, shops.postcode 
+0

場所で検索する場合、 'stores.id = stores_delivery_area.shop_id AND stores.postcode = shops_delivery_area.postcode'を使用する必要があります。 –

0

両方のテーブルの郵便番号と一致すると、場所によって検索すると別個のショップ名が表示されます。 のようなもの

SELECT DISTINCT shops.*, 
     DA.delivery_cost, 
     DA.postcode 
FROM shops 
     JOIN shops_delivery_area as DA on (DA.shop_id = shops.id and DA.postcode = shops.postcode) 
WHERE DA.postcode = "Liverpool" 
     OR location = "Liverpool" 
関連する問題