我有2种表格类型,1)属性2)预订日期。
下面的查询应该是在可用性表中选择没有相关预订日期的属性。
SELECT prop.*, ( 3959 * acos( cos( radians(50.2375800) ) * cos( radians(prop.latitude) ) * cos( radians(prop.longitude ) - radians(-3.7697910) ) + sin( radians(50.2375800) ) * sin( radians(prop.latitude)))) AS dstnc
FROM (SELECT * FROM `props_01` UNION ALL SELECT * FROM `props_03`) AS prop
LEFT JOIN `availability` AS avail ON prop.unique_code=avail.ucode AND (avail.date != '20131228' AND avail.date != '20131229' AND avail.date != '20131230')
WHERE `status`='on' AND avail.ucode IS NULL AND prop.country!='Wales'
GROUP BY `unique_code`
HAVING dstnc <= 2
ORDER BY prop.sleeps ASC, prop.package ASC
props_XX
表包含属性数据,而availability
表包含3列(唯一ID /属性代码“ucode”/预订日期“date”),这些表引用每个属性一个独特的10个字符代码。
即使我只使用一个属性表执行查询,它仍然超时
当我不包含查询的可用性部分时,它运行正常,但是在可用性日期,查询似乎陷入循环并最终超时。
有人可以帮助解决方案,谢谢。
答案 0 :(得分:1)
您不提供有关表格大小或结果结果集大小的信息。我认为,从名称来看,prop.unique_code
实际上是唯一的。
这是格式化的查询,因此我可以更好地阅读:
SELECT prop.*, . . .
FROM (SELECT * FROM `props_01` UNION ALL SELECT * FROM `props_03`
) AS prop LEFT JOIN
`availability` AS avail
ON prop.unique_code = avail.ucode AND
(avail.date not in ('20131228', '20131229', '20131230')
WHERE `status` = 'on' AND avail.ucode IS NULL AND prop.country != 'Wales'
GROUP BY `unique_code`
HAVING dstnc <= 2
ORDER BY prop.sleeps ASC, prop.package ASC;
第一个建议是availability(ucode)
或availability(date, ucode)
上的索引。这很可能会解决性能问题。
答案 1 :(得分:0)
您按prop.unique_code = avail.ucode
进行加入
但后来被avail.ucode IS NULL
过滤,所以这没有多大意义。
所以prop.unique_code
也必须NULL
。