【发布时间】:2012-03-23 09:31:17
【问题描述】:
我有 2 个表格(就本问题而言)公司和发票。一个公司可以有多个发票,它们通过 company_id 自动增量关联。我希望从每个有发票的公司的最新发票中获取数据。
我不仅想要最近相关记录的日期,还想要来自该相关记录的各种数据。
我尝试了几种不同的方法,但我现在得到的查询很糟糕......这让我不得不在关系数据库中求助于这样的东西让我很痛苦。
这是查询...
SELECT `companies`.`company_name`, `invoices_latest`.`data`,
SUBSTRING_INDEX( SUBSTRING_INDEX(`invoices_latest`.`data`, '~', 1), '~', -1) AS `last_invoice_stamp`,
SUBSTRING_INDEX( SUBSTRING_INDEX(`invoices_latest`.`data`, '~', 2), '~', -1) AS `last_invoice_id`,
SUBSTRING_INDEX( SUBSTRING_INDEX(`invoices_latest`.`data`, '~', 3), '~', -1) AS `last_invoice_reference`,
SUBSTRING_INDEX( SUBSTRING_INDEX(`invoices_latest`.`data`, '~', 4), '~', -1) AS `last_invoice_amount`
FROM `companies`
INNER JOIN
(
SELECT `company_id`, MAX(CONCAT_WS('~', `invoice_stamp`, `invoice_id`, `reference`, CONCAT_WS(' ', `currency`, FORMAT(`amount`, 2)))) AS `data`
FROM `invoices`
GROUP BY `invoices`.`company_id`
) AS `invoices_latest` ON `companies`.`company_id`=`invoices_latest`.`company_id`
WHERE `invoices_latest`.`data` IS NOT NULL
ORDER BY `companies`.`company_name`
连接派生表中的数据然后将其拆分到父查询中是很糟糕的,但这是我发现实现我所寻找的唯一方法。
我试过了……
SELECT `companies`.`company_id`, `companies`.`company_name`, `invoices_latest`.`invoice_id`, FROM_UNIXTIME(`invoices_latest`.`invoice_stamp`)
FROM `companies`
LEFT JOIN (
SELECT `company_id`, `invoice_id`, `invoice_stamp`
FROM `invoices`
ORDER BY `invoice_stamp` DESC
LIMIT 0, 1
) AS `invoices_latest` ON `companies`.`company_id`=`invoices_latest`.`company_id`
WHERE `invoices_latest`.`invoice_id` IS NOT NULL
但它没有按预期工作,只返回 1 行 - 因为我相信派生表中的 LIMIT 实际上应用于父查询。很遗憾你不能做这样的事情,因为这将是一个易于阅读的解决方案。
对于我上面所说的可怕的串联,还有更好的选择吗?
【问题讨论】: