2013-07-16 3 views
0

У меня есть запрос mysql, который взаимодействует из 2 таблиц, 'свойств' и 'предложений'.MySQL-запрос для нескольких JOIN двух таблиц в нескольких столбцах

Таблица «Предложения» может соответствовать записи в таблице свойств, либо ссылаясь на конкретную запись по уникальному коду, либо по уезду или региону, в котором находится свойство.

Вот пример моего запроса ...

SELECT *, ROUND(((3959 * acos(cos(radians(51.1080390)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-4.1610140)) + sin(radians(51.1080390)) * sin(radians(latitude)))) * 2),0)/2 AS `distance` 
FROM `properties` AS prop 
LEFT JOIN `offers` ON prop.code = offers.the_property 
LEFT JOIN `offers` AS offsCnty ON prop.county = offsCnty.the_county 
LEFT JOIN `offers` AS offsRgn ON prop.region = offsRgn.the_region 
HAVING distance <= 2.5 
ORDER BY `sleeps` ASC, `distance` ASC 
LIMIT 0, 10 

В таблице предлагает 3 колонки the_property/the_county/the region имеют решающее значение для связи соответствующие предложения с имущественным/х. Если предложение применяется ко всему округу, поле the_property пустое, в противном случае, если предложение относится к определенному свойству, это поле содержит уникальный код свойства.

Я думал, что использование нескольких JOIN будет решением, однако когда любое из 3 основных полей offer пусто, соединение возвращает «NULL» для полей таблицы offers.

Как это можно решить ??

Большое спасибо

+1

'ЛЕВОГО JOIN' означает, что если нет строки, которая соответствует' ON' состоянию, его должен заполнить его «NULL». Но пока он соответствует одному из трех объединений, вы должны получить непустые значения в этом наборе столбцов. – Barmar

ответ

1

Вы можете объединить эти две таблицы и указать дополнительные условия соединения в соединении пункта или где положение

SELECT *, ROUND(((3959 * acos(cos(radians(51.1080390)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-4.1610140)) + sin(radians(51.1080390)) * sin(radians(latitude)))) * 2),0)/2 AS `distance` 
FROM `properties` AS prop 
LEFT JOIN `offers` ON prop.code = offers.the_property 
     OR prop.county = offers.the_county 
     OR prop.region = offers.the_region 
HAVING distance <= 2.5 
ORDER BY `sleeps` ASC, `distance` ASC 
LIMIT 0, 10 
+0

Я думаю, что это должно быть 'OR', а не' AND'. – Barmar

+0

@Barmar oh еще раз спасибо :) – DevZer0

+0

Но я не уверен, что это правильно, потому что тогда он может соответствовать нескольким строкам в 'предложениях', и ему просто нужна одна строка для каждого свойства. – Barmar

0

Колонны позже предлагает столы перезаписывать более ранние, вам нужно псевдоним им:

SELECT *, offers.the_property the_property_from_offers ...

0

у вас есть три разных предлагает таблицы с одинаковыми именами полей. Проблема в том, что MySQL не разрешает несколько столбцов с тем же именем.

Наиболее простое решение изменить присоединиться использовать or в on пункте:

SELECT *, ROUND(((3959 * acos(cos(radians(51.1080390)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-4.1610140)) + sin(radians(51.1080390)) * sin(radians(latitude)))) * 2),0)/2 AS `distance` 
FROM `properties` prop LEFT JOIN 
    `offers` 
     ON prop.code = offers.the_property or 
     (prop.county = offsCnty.the_county and offers.the_property is null) or 
     prop.region = offsRgn.the_region 
HAVING distance <= 2.5 
ORDER BY `sleeps` ASC, `distance` ASC 
LIMIT 0, 10; 

Если вы использовать несколько соединений, то вы должны иметь такие выражения, как следующее в пункте select:

select coalesce(offers.code, offsCnty.code, offsRgn.code) as code 

для каждой колонки в таблице предложений.

+0

MySQL допускает несколько столбцов с одинаковыми именами, он префикс их с псевдонимом таблицы в результатах. Однако API-интерфейсы PHP отбрасывают префиксы, поэтому вам нужно использовать числовые индексы столбцов для доступа ко всем. – Barmar

0

Если вы хотите наиболее специфичное предложение взять верх, я думаю, вы должны написать это:

SELECT prop.*, 
     COALESCE(offers.col1, offsCnty.col1, offsRgn.col1) col1, 
     COALESCE(offers.col2, offsCnty.col2, offsRgn.col2) col2, 
     ..., 
     <huge formula> distance 
FROM `properties` AS prop 
LEFT JOIN `offers` ON prop.code = offers.the_property 
LEFT JOIN `offers` AS offsCnty ON prop.county = offsCnty.the_county 
LEFT JOIN `offers` AS offsRgn ON prop.region = offsRgn.the_region 
HAVING distance <= 2.5 
ORDER BY `sleeps` ASC, `distance` ASC 
LIMIT 0, 10 
Смежные вопросы