[英]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不允许多个具有相同名称的列。
最简单的解决方法是更改要使用的连接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
优惠表中的每一列。
如果您希望最具体的报价优先,那么我认为您必须这样写:
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.