0

ユーザーが場所に応じて複数の通貨で複数の価格を追加できるようにする 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;

通貨換算レートを取得し、価格をユーロに変換するクエリを追加する必要があるため、ユーロ、ポンド、またはドルのいずれであっても、最初のクエリで実際に最も安い価格を取得します。

これらすべてを 1 つのクエリで実行することは可能ですか。それを行う最も効率的な方法は何ですか

ありがとう!/マティアス

4

1 に答える 1