php - 具有多重连接、子查询和半径的高级 mysql 查询

标签 php mysql

我有一个使用 php 和 mysql 的应用程序,允许用户根据位置添加多种货币的多个价格。

当前数据库看起来像这样......'

单位可以有多个头寸,并且可以有多个价格...

units
    -id

positions
    -id
    -unit_id
    -lat
    -lng

prices
    -id
    -position_id
    -currency_id
    -price
    -min_price
    -weight
    -cu_meters

currencies
    -id
    -iso
    -name

rates
    -id
    -from_currency_id
    -to_currency_id
    -rate

我需要的是获得最便宜的价格(转换为欧元,以便我可以比较它们),并按位置分组,并按单位分组的最接近的位置排序。

我现在要做的就是首先从价格表中获取所有仓位 ID。

SELECT id, position_id
FROM ( SELECT * FROM prices ORDER BY price, min_price ) AS p
WHERE weight >= ".self::connection()->escape($weight)."
AND cu_meters >= ".self::connection()->escape($cu_meters)."
GROUP BY position_id
ORDER BY price, min_price

然后,获取与上一个查询结果最接近的位置

SELECT id, unit_id, lat, lng
FROM
    (
        SELECT
            id,
            unit_id,
            lat,
            lng,
            return_position,
            return_lat,
            return_lng,
            ( 6371 * acos( cos( radians(".Position::connection()->escape($lat).") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(".Position::connection()->escape($lng).") ) + sin( radians(".Position::connection()->escape($lat).") ) * sin( radians( lat ) ) ) ) AS distance
        FROM positions
        ORDER BY distance ASC
    ) AS pos
WHERE id IN(".implode(",", array_keys($position_ids)).")
GROUP BY unit_id
ORDER BY distance ASC
LIMIT 20;

我必须添加一个查询来获取货币兑换率并将价格转换为欧元,以便我在第一个查询中真正获得最便宜的价格,无论它们是欧元、英镑还是美元。

是否可以在一个查询中完成所有这些操作。最有效的方法是什么

谢谢! /马蒂亚斯

最佳答案

您可以简单地将第一个查询作为子选择运行,例如

WHERE id IN (
    SELECT id FROM prices ORDER BY price, min_price ) AS p
    WHERE weight >= ".self::connection()->escape($weight)."
    AND cu_meters >= ".self::connection()->escape($cu_meters)."
    GROUP BY position_id
    ORDER BY price, min_price
)

您唯一希望将它们作为单独的查询运行的情况是您希望将这些 ID 保留在子查询中以用于其他目的。但是,如果您在脚本的其他地方不再需要它们,那么子选择会更高效,但会砍掉至少一个 SQL 解析序列。

关于php - 具有多重连接、子查询和半径的高级 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667100/

相关文章:

php - 无法通过 php 连接到 mysql,但从命令行可以正常工作

php - PHP 中有没有办法将数据库从本地主机上传到云端? MySQL

php - 根据当前年月创建上传路径

php - Mysql Alias 中的自定义数组索引

error-handling - 让 Vanilla php显示错误而不是空白页,就像ROR一样

javascript - jquery 按钮类更改

mysql - 如何远程连接到 Azure 网站中的 ClearDB?

php - 在 xampp 上安装 cake php

mysql - mysql中主键的选择和自动增量的意外行为

MySQL - 从一列中创建一条记录