簡體   English   中英

具有多個聯接,子查詢和半徑的高級mysql查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM