MySQL のテーブル内の各レコードに対して選択された関連レコードを出力する方法を探しています。さらに説明します...
私は 2 つのテーブルcurrencyとexchange_ratesを持っています。テーブルはcurrency_codeフィールドで結合され、各通貨レコードには関連する複数の為替レート レコードがあり、各為替レート レコードは異なる日を表します。したがって、通貨と exchange_rates の間には 1 対多の関係があります。
各通貨のテーブルから完全なレコードを取得したいのですexchange_rates
が、どの関連レコードを選択するかについて特定の基準を定義できます。各通貨の最新の exchange_rate だけでなくexchange_rates
、フィールドを持つ各通貨の最新のレコードかもしれませんcriteria_x=NULL
。
派生テーブル内で使用できないのは残念です。LIMIT
それ以外の場合、このようなものはきちんとした読みやすいソリューションになります...
SELECT `currencies`.`currency_code`, `currencies`.`country`, `exchange_rates`.`id`,
FROM_UNIXTIME(`exchange_rates`.`datestamp`), `rate`
FROM `currencies`
INNER JOIN (
SELECT `id`, `currency_code`, `invoice_id`, `datestamp`, `rate`
FROM `exchange_rates`
WHERE `criteria_x`=NULL AND `criteria_y` LIKE 'A'
ORDER BY `datestamp` DESC
LIMIT 0, 1
) AS `exchange_rates` ON `currencies`.`currency_code`=`exchange_rates`.`currency_code`
ORDER BY `currencies`.`country`
句は、LIMIT
派生テーブルではなく、親クエリに適用されます。
これは私がこれを行うために見つけた唯一の方法です...
SELECT `currencies`.`currency_code`, `currencies`.`country`,
FROM_UNIXTIME( SUBSTRING_INDEX( SUBSTRING_INDEX(`exchange_rates`.`concat`, '-', 1), '-', -1)) AS `datestamp`,
SUBSTRING_INDEX( SUBSTRING_INDEX(`exchange_rates`.`concat`, '-', 2), '-', -1) AS `id`,
SUBSTRING_INDEX( SUBSTRING_INDEX(`exchange_rates`.`concat`, '-', 3), '-', -1) AS `rate`
FROM `currencies`
INNER JOIN (
SELECT `currency_code`, MAX(CONCAT_WS('-', `datestamp`, `id`, `rate`)) AS `concat`
FROM `exchange_rates`
WHERE `criteria_x`=NULL AND `criteria_y` LIKE 'A'
GROUP BY `exchange_rates`.`currency_code`
) AS `exchange_rates` ON `currencies`.`currency_code`=`exchange_rates`.`currency_code`
ORDER BY `currencies`.`country`
したがって、一連のフィールドを連結し、それに対して を実行してMAX()
、グループ内の並べ替え順序を取得し、親クエリでそれらのフィールドを解析しますSUBSTRING_INDEX()
。問題は、このメソッドが連結フィールドでMIN()
orを使用できる場合にのみ機能することです。MAX()
文字列を並べ替えたり、複数の基準で並べ替えたりしたいが、単一のレコードに制限したい場合は理想的ではありません。
また、リレーショナル データベースから必要なデータを取得するために恐ろしい文字列操作に頼らなければならないのは、身体的な苦痛を引き起こします。もっと良い方法があるはずです。
より良い方法の提案はありますか?