如何在派生表概念中转换此查询

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 的追加查询中将数据类型从文本转换为是/否?

为啥 CTE 比游标/派生表/子查询/临时表等更好?

使用带有 ISNUMERIC 的派生表进行查询会导致转换失败(varchar 到 int)

如何在 VBA 中自动执行电源查询?

将值传递给派生表