【发布时间】:2012-05-03 15:48:22
【问题描述】:
我正在寻找一种方法来为 MySQL 表中的每条记录输出选定的相关记录。我会进一步解释...
我有 2 张表 currencies 和 exchange_rates。表格由currency_code字段连接,每条货币记录有多个相关的汇率记录,每条汇率记录代表不同的一天。所以货币和 exchange_rates 之间存在 1:many 的关系。
我想从exchange_rates 表中检索每种货币的完整记录,但能够定义选择哪个相关记录的特定标准。不仅是每种货币的最新 exchange_rate,还可能是具有 criteria_x=NULL 字段的每种货币的最新 exchange_rates 记录。
很遗憾您不能在派生表中使用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() 或MAX() 时才有效。如果我想对字符串进行排序或按多个条件排序但限制为单个记录,那将是不理想的。
此外,我不得不求助于可怕的字符串操作来从关系数据库中获取我想要的数据,这也让我感到身体上的痛苦——必须有更好的方法!
有人对更好的方法有任何建议吗?
【问题讨论】:
-
请提供您的表结构和一些数据,以便我们了解如何解决它