繁体   English   中英

MySQL查询多个列上的多个JOIN两个表

[英]MySQL query for multi JOIN two tables on multiple colums

我有一个mysql查询,它从2个表(“属性”和“要约”)进行交互。

“要约”表可以通过用唯一代码或属性所在的县或地区引用特定记录来匹配属性表中的记录。

这是我的查询示例...

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适用于整个县,则字段the_property为空白,否则,如果the_property用于特定属性,则此字段包含唯一的属性代码。

我以为通过使用多个JOIN将是解决方案,但是,当3个主要offer字段中的任何一个为空时,join会为offers表字段返回“ NULL”。

如何解决?

非常感谢

您可以联接两个表,并在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

后面的列中的表覆盖了以前的表,您需要对其进行别名:

SELECT *,offers.the_property the_property_from_offers,...

您有三个不同的要约表,它们都具有相同的字段名称。 问题是MySQL不允许多个具有相同名称的列。

最简单的解决方法是更改​​要使用的连接oron子句中:

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

优惠表中的每一列。

如果您希望最具体的报价优先,那么我认为您必须这样写:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM