MySQL получает данные самой последней связанной записи - PullRequest
0 голосов
/ 06 марта 2012

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

Есть ли лучшая альтернатива ужасной конкатенации, с которой я столкнулся выше?

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Я предлагаю подойти к этому так:

SELECT * FROM `invoice` WHERE `company_id`=ID ORDER BY `date` DESC LIMIT 25;

если вы не указываете идентификатор в команде, вы можете выбрать все идентификаторы компании и сделать одно и то же для каждого из них с помощью аналогичной команды:

SELECT * FROM `invoice` WHERE `company_id` IN(SELECT `company_id` FROM `companies`) ORDER BY `date` DESC LIMIT 25;
0 голосов
/ 06 марта 2012
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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...