@SemenDemon

Как избавится от дублирования при join mysql?

Дублируются записи при JOIN а как правильно этого избежать, не перегружая базу не ясно.
Есть три таблицы
sa_real - описание недвижимости (цена, площадь и тд) расположение указывается через id здания в котором расположена недвижимость
sa_house_location - расположение здания в котором находится недвижимость (координаты, адрес, индекс и тд ключ house_location_id_fk)
sa_metro_house - расстояние от объекта недвижимости до ориентира ( в данном случае метро)



sa_real
=============
id | house_location_id_fk | price
---------------------------------------------
1 | 2 | 10000
2 | 3 | 5000
3 | 4 | 10000

sa_metro_house
============
location_id_fk | metro_id_fk | dest [расстояние до метро]
-----------------------------------
2 | 4 | 300
2 | 7 | 400
3 | 9 | 150

SELECT sa_real.* FROM `sa_real` JOIN sa_metro_house on sa_metro_house.location_id_fk = sa_real.house_location_id_fk WHERE sa_metro_house.metro_id_fk in ( 4, 7, 6)

в результате получаем:

id | house_location_id_fk | price
----------------------------------------------
2 | 3 | 5000
2 | 3 | 5000

Запись дублируется, оно и понятно, а дубликаты не нужны. как правильнее избавится от дубликатов?
Нужно при вводе нужных станций метро получить набор объектов которые рядом.
сначала сделать SELECT DISTINCT
или подзапросом SELECT sa_real.* FROM `sa_real` WHERE location_id_fk in (select location_id_fk from sa_metro_house where metro_id_fk in (4,7,6) )
или есть более правилные варианты?
  • Вопрос задан
  • 1566 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `sa_real`.*
  FROM (
    SELECT DISTINCT `location_id_fk`
      FROM `sa_metro_house`
      WHERE `metro_id_fk` IN (4,7,6)
  ) AS `t`
  JOIN `sa_real` ON `sa_real`.`house_location_id_fk` = `t`.`location_id_fk`

или
SELECT *
  FROM `sa_real`
  WHERE `house_location_id_fk` IN (
      SELECT `location_id_fk`
        FROM `sa_metro_house`
        WHERE `metro_id_fk` IN (4,7,6)
      )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега MySQL
Web developer
Чтобы ответить на вопрос "как правильно", сначала сами ответьте "а что надо получить".
Например, есть ГУМ, от которого до Охотного ряда 200 метров и до Площади Революции 300 метров.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы