我正在寻找一种方法来为 MySQL 表中的每条记录输出选定的相关记录。我会进一步解释...
我有 2 个表currency和exchange_rates。这些表由currency_code字段连接,每条货币记录有多个相关的汇率记录,每条汇率记录代表不同的一天。所以货币和 exchange_rates 之间存在 1:many 的关系。
我想从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()
其上运行 a 以获得我在组内的排序顺序,然后在父查询中使用SUBSTRING_INDEX()
. 问题是这种方法仅在我可以使用 a MIN()
orMAX()
连接字段时才有效。如果我想对字符串进行排序或按多个条件排序但仅限于单个记录,那将是不理想的。
此外,我不得不求助于可怕的字符串操作来从关系数据库中获取我想要的数据,这也让我感到身体上的痛苦——必须有更好的方法!
有人对更好的方法有任何建议吗?