如何在派生表概念中转换此查询
Posted
技术标签:
【中文标题】如何在派生表概念中转换此查询【英文标题】:How to convert this query in derived table concept 【发布时间】:2017-06-10 06:42:53 【问题描述】:更新:
如何在派生表中引入下面的查询
( 3959 * acos( cos( 弧度(36.247137) ) * cos( 弧度(cm
.lat
) ) * cos( 弧度(cm
.lng
) - 弧度(-115.221032) ) + sin(弧度(36.247137))* sin(弧度(cm
.lat
))))AS距离
在这个 mysql 查询中:
MySql 查询:
SELECT ( 3959 * acos( cos( radians(36.247137) ) * cos( radians( `cm`.`lat` ) ) * cos( radians(`cm`.`lng` ) - radians(-115.221032) ) + sin( radians(36.247137) ) * sin( radians( `cm`.`lat` ) ) ) ) AS distance, min(pl.price_pure) as minPrice, max(pl.price_pure) as maxPrice, min(pl.`squarefeet_pure`) as minSquare, max(pl.`squarefeet_pure`) as maxsquare FROM `plans` pl INNER JOIN property pr ON pr.id = pl.property_id INNER JOIN communities cm ON cm.id = pr.community_id Having distance < 20 order by pl.price_pure, pl.squarefeet_pure
.................................................. .............................
上一个查询标题是: 为什么在MySql查询中应用Max, MIN价格公式没有结果
详细问题:
http://pastebin.com/UR48mbtq 这是我的 mysql 查询 .. 我想获得低于 20 英里距离的房屋的最高和最低价格.. 但结果为空。示例中的距离是 20,但我的数据库也有 20 英里和 20 英里以下的结果
MySql 查询:
SELECT ( 3959 * acos( cos( radians(36.247137) ) * cos( radians( `cm`.`lat` ) ) * cos( radians(`cm`.`lng` ) - radians(-115.221032) ) + sin( radians(36.247137) ) * sin( radians( `cm`.`lat` ) ) ) ) AS distance, min(pl.price_pure) as minPrice, max(pl.price_pure) as maxPrice, min(pl.`squarefeet_pure`) as minSquare, max(pl.`squarefeet_pure`) as maxsquare FROM `plans` pl INNER JOIN property pr ON pr.id = pl.property_id INNER JOIN communities cm ON cm.id = pr.community_id Having distance < 20 order by pl.price_pure, pl.squarefeet_pure
有了这个结果:
distance minPrice maxPrice minSquare maxsquare
1754.3401139613718 0 21000003 0 8607
但是当我添加 Have 子句时,结果为空,下面的查询
SELECT ( 3959 * acos( cos( radians(36.247137) ) * cos( radians( `cm`.`lat` ) ) * cos( radians(`cm`.`lng` ) - radians(-115.221032) ) + sin( radians(36.247137) ) * sin( radians( `cm`.`lat` ) ) ) ) AS distance, (pl.price_pure) as minPrice, (pl.price_pure) as maxPrice, (pl.`squarefeet_pure`) as minSquare, (pl.`squarefeet_pure`) as maxsquare FROM `plans` pl INNER JOIN property pr ON pr.id = pl.property_id INNER JOIN communities cm ON cm.id = pr.community_id Having distance < 20 order by pl.price_pure, pl.squarefeet_pure
更新: 如果我从查询中删除最大、最小公式,那么它也会给我 400 个结果..
【问题讨论】:
而不是你可以试试 where 吗? @krishnpatel 它的虚拟领域和我不能在这里应用的东西。我以前也试过。 CAST(Distansc login AS UNSIGNED) AS 距离。你能试试吗 距离 > 来获取这些数据 @krishnpatel 我想找到最多 20 英里的结果.. 不应该超过 20 英里.. 【参考方案1】:Having
是在生成查询行之后应用的子句。由于您的查询中有聚合函数,但没有 GROUP BY
,mysql 为您提供单个(样本)distance
结果,然后是整个数据集的最小值和最大值。
之后,应用 having
子句 - 正如 @krishnpatel 指出的那样,1754
在您的选择中添加一个GROUP BY
,相当于您的distance
计算,以返回您正在寻找的结果。
【讨论】:
【参考方案2】:首先收集 20 英里内的属性的 ID。
然后将其用作子查询并将JOIN
用于主表以完成其余工作:
SELECT MIN(...), ...
FROM ( SELECT id FROM tbl WHERE ... < 20 ) AS x
JOIN tbl ON x.id = tbl.id;
没有HAVING
,没有GROUP BY
(除非我错过了什么)。
【讨论】:
以上是关于如何在派生表概念中转换此查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Data (JPA) 派生查询中按多个属性排序?
如何在 MS Access 的追加查询中将数据类型从文本转换为是/否?