0

「プロパティ」と「オファー」の 2 つのテーブルから対話する mysql クエリがあります。

「offers」テーブルは、一意のコードによって、またはプロパティが配置されている郡または地域によって特定のレコードを参照することによって、プロパティ テーブル内のレコードと一致させることができます。

これが私のクエリの例です...

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フィールドのいずれかが空の場合、結合はoffersテーブルフィールドに対して「NULL」を返します。

これはどのように解決できますか??

どうもありがとう

4

4 に答える 4

1

2 つのテーブルを結合し、join 句または where 句で追加の結合条件を指定できます

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
于 2013-07-16T13:11:55.583 に答える
0

すべて同じフィールド名を持つ 3 つの異なるオファー テーブルがあります。問題は、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

オファー テーブルの各列に対して。

于 2013-07-16T13:17:39.797 に答える
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
于 2013-07-16T13:18:36.173 に答える
0

後のオファー テーブルの列は以前のものを上書きするため、エイリアスを設定する必要があります。

SELECT *, offers.the_property the_property_from_offers, ...

于 2013-07-16T13:13:28.323 に答える