[英]Advanced mysql query with multiple joins, sub queries and radius
我有一個使用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保留在子查詢中以用於其他目的。 但是,如果您在腳本中的其他位置不再需要它們,則subselect會更有效,但會切斷至少一個SQL解析序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.