我有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实际上应用于父查询。很遗憾你不能做那样的事情,因为它是一个易于阅读的解决方案。
对于我上面发生的可怕连接,有没有更好的替代方案?
答案 0 :(得分:0)
select company,*, invoice.*
from company, invoice
where company.company_id = invoice.company_id
and (invoice.company_id, invoice.date) in (
select company_id, max(date) from invoices group by company_id
);
答案 1 :(得分:0)
我的建议是这样做:
SELECT * FROM `invoice` WHERE `company_id`=ID ORDER BY `date` DESC LIMIT 25;
如果您没有在命令中指定ID,您可以选择所有公司ID,并使用类似的命令对每个ID做同样的事情:
SELECT * FROM `invoice` WHERE `company_id` IN(SELECT `company_id` FROM `companies`) ORDER BY `date` DESC LIMIT 25;