Дублируются записи при JOIN а как правильно этого избежать, не перегружая базу не ясно.
Есть три таблицы
sa_real - описание недвижимости (цена, площадь и тд) расположение указывается через id здания в котором расположена недвижимость
sa_house_location - расположение здания в котором находится недвижимость (координаты, адрес, индекс и тд ключ house_location_id_fk)
sa_metro_house - расстояние от объекта недвижимости до ориентира ( в данном случае метро)
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)
Запись дублируется, оно и понятно, а дубликаты не нужны. как правильнее избавится от дубликатов?
Нужно при вводе нужных станций метро получить набор объектов которые рядом.
сначала сделать 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) )
или есть более правилные варианты?
Информация об удаленности не нужна.
сейчас сделал вот так
$this->db->where($this->table_name.' .house_location_id_fk in ( select sa_metro_house.location_id_fk from sa_metro_house where sa_metro_house.metro_id_fk in ('.implode(',', $metro).') )', NULL, FALSE);
все данные фильтруются на безопастность ранее. поэтому просто Implode сделал.
результат
spb.stopagent.ru/search/rent/db/id/status/see/m/6_27
но интересует вопрос нагрузки, так как запрос нагруженный довольно.
Да верно. сейчас запрос выполняется быстро. Но в таблице всего sa_metro_house 36,596 связей и всего 42,957 объектов в sa_real
правильно ли что при таком запросе
из sa_metro_house 36,596 выбираются подходящие например нужны станции 4 и 6 остается 5000записей и все эти 5000 подставляются в запрос where in house_location_id_fk.
т.е. что будет когда их будет не 5000тыс а 500 000тыс. оптимальный ли это способ. страшно потом в спешке переделывать. или тут только нагрузочное тестирование поможет?
Для правильного вопроса надо знать половину ответа
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)
)
Чтобы ответить на вопрос "как правильно", сначала сами ответьте "а что надо получить".
Например, есть ГУМ, от которого до Охотного ряда 200 метров и до Площади Революции 300 метров.
вы верно подметили, сортировка до метро используется при выводе информации об объекте.
когда не в поиске то сначала выводится охотный ряд 200 метров затем Площадь революции 300 метров.
в поиске же это не имеет значения. все связанные станции находятся в пределах 1500метров. и важен сам факт наличия связи а расстояние уже втрорично и выводится подробно в описании. Этот запрос нужен только для поиска связей.