これが私が取り組んでいるものです:
CREATE TABLE IF NOT EXISTS `rate` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`client_company` int(11) DEFAULT NULL,
`client_group` int(11) DEFAULT NULL,
`client_contact` int(11) DEFAULT NULL,
`role` int(11) DEFAULT NULL,
`date_from` datetime DEFAULT NULL,
`hourly_rate` decimal(18,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `rate` (`id`, `client_company`, `client_group`,
`client_contact`, `role`, `date_from`, `hourly_rate`)
VALUES
(4, NULL, NULL, NULL, 3, '2012-07-30 14:48:16', 115.00),
(5, 3, NULL, NULL, 3, '2012-07-30 14:51:38', 110.00),
(6, 3, NULL, NULL, 3, '2012-07-30 14:59:20', 112.00);
この表には、クライアントのチャージアウト率が格納されています。職務の正しいレートを探すときは、最初に特定のロールとクライアントの連絡先に一致するレートを探し、レートが見つからない場合は、ロールとクライアントグループを一致させようとするという考え方です(または「部門」)、次にクライアント企業、そして最後に役割自体のグローバルレートを探します。罰金。
料金は時間の経過とともに変化する可能性があるため、テーブルには、役割、会社、グループ、およびクライアントの連絡先の任意の組み合わせに一致する複数のエントリが含まれる場合があります。個別の組み合わせごとに最新のもののみを返すクエリが必要です。
ほんの数日前にほぼ同じ質問をしたこと、そしてこのトピックはさまざまな形でかなり頻繁に見られることを考えると、私は機知に富んでいることをお詫びし、以下のクエリが3つすべてを返す理由を誰かに説明するようにもう一度頼むことができます上記のレコードであり、私が望むように、ID4と6のレコードのみではありません。
NULLを含む列に基づいて結合しようとしていることと関係がありますか?
SELECT
rate.*,
newest.id
FROM rate
LEFT JOIN rate AS newest ON(
rate.client_company = newest.client_company
AND rate.client_contact = newest.client_contact
AND rate.client_group = newest.client_group
AND rate.role= newest.role
AND newest.date_from > rate.date_from
)
WHERE newest.id IS NULL