我有一个使用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;
我必须添加一个查询来获取货币转换率并将价格转换为欧元,所以我真的在第一次查询中得到最便宜的价格,无论是欧元,英镑还是美元。
是否可以在一个查询中完成所有这些操作。什么是最有效的方法
谢谢! /马蒂亚斯
答案 0 :(得分:0)
您可以简单地将第一个查询作为子选择运行,例如
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保留在子查询中以用于其他目的。但是如果你在脚本的其他地方不再需要它们,那么subselect将会更有效率,但是至少会删除一个SQL解析序列。