У меня есть 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`
Объединение данных в производной таблице с последующим разделением их в родительском запросе ужасно, но я нашел единственный способ добиться того, что я ищу.
Я пыталсяthis ...
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 в производной таблице фактически применяется к родительскому запросу.Жаль, что вы не можете сделать что-то подобное, так как это было бы легко читаемым решением.
Есть ли лучшая альтернатива ужасной конкатенации, с которой я столкнулся выше?