Проблема с дублированием - PullRequest
2 голосов
/ 10 февраля 2012

Рассмотрим запрос 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 |
+------------------+---------+----------+---------------+

Пользователь может выполнять поиск по почтовому индексу (например, 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      |
+----+----------+-----------+----------+---------------+----------+

Ответы [ 4 ]

0 голосов
/ 10 февраля 2012

Мне удалось заставить его работать.Я использовал 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 голосов
/ 10 февраля 2012
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 голосов
/ 10 февраля 2012

совпадение почтового индекса из обеих таблиц даст вам отличные названия магазинов при поиске по местоположению.что-то вроде

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"
0 голосов
/ 10 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...