2012-02-10 3 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 стол

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

shops_delivery_area стол

+------------------+---------+----------+---------------+ 
| 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 | 
+------------------+---------+----------+---------------+ 

Пользователь может осуществлять поиск по Postcode (например: L14, L15, L16) или Место из текстового поля.

Если пользователь вводит «Ливерпуль», он найдет все магазины, расположенные в «Ливерпуле». Проблема в том, что будут повторяющиеся строки имени магазина (таблица магазинов). Как решить эту проблему?

Результат (Поиск по местоположению):

Как избежать дублирования названия магазина?

я должен делать: 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 возвращает строки, которые имеют разные значения в полях, которые вы группируете. Например, группировка по имени магазина будет отображать только строки с отличным именем магазина. Но будьте осторожны, что для полей 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" и «почтовый индекс», если они разные, вы всегда будете получать «дубликаты», чтобы удалить эти два, и вы увидите только один из них.

Редактировать: Если вам нужны эти поля, а также фильтр по ним по умолчанию, который должен иметь магазин. Если вам нужны все результаты «delivery_cost» и «postcode», но только один результат, вы должны переосмыслить то, что вы пытаетесь сделать, или объяснить, какой результат вы ожидаете.

+0

Да, я понимаю это, но мне нужны эти два поля. –

+0

@ user791022, так какие значения должны указывать в параметрах delivery_cost и postcode, когда есть дубликаты, как в примере, который вы указали? –

+0

@AdityaNaidu При поиске по местоположению он должен использовать магазины 'shops.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

При поиске по местоположению он должен использовать 'shops.id = магазины_delivery_area.shop_id AND shops.postcode = магазины_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" 
Смежные вопросы