请参考这个 SQLFiddle:http ://sqlfiddle.com/#!2/9db4f
表“费率”存储工作角色的每小时收费率,并可选择存储基于客户公司、组(“组”只是公司的一个部门)和客户联系人的角色的不同费率。
费率也可能随时间而变化。
我想为角色、公司、组和联系人的给定组合选择一个最近的、最合适的费率。它应该尝试按以下顺序匹配:
- client_contact、client_group、client_company 和角色
- 客户组、客户公司和角色
- 客户公司和角色
- 只是角色
例如:我正在寻找一个费率匹配角色 ID 3、公司 ID 3 和客户 ID 4。
没有与所有这些匹配的记录,因此它应该查找仅匹配角色 ID 3 和公司 ID 3 的记录。(其他字段 - client_contact 和 client_group - 必须为 NULL)。其中有两个:行 ID 的 2 和 3。它应该选择行 ID 3,因为它具有最近的“date_from”日期。
另一个例子:我正在寻找一个费率匹配的角色 ID 3 和公司 ID 25。其中也没有一个,因此它应该寻找一个仅匹配角色 ID 3 的角色,而所有其他值都为 NULL。只有一个匹配的行:数字 1。
当前 SQLFiddle 上的查询执行“获取最新”位,但我坚持让它匹配可选列(如果它们存在)。
哈尔普:(
编辑:哎呀,看起来 SQLFiddle 只保存模式,而不是查询。这就是我所拥有的:
SELECT
rate.*
FROM
rate
LEFT JOIN rate AS newest ON (
rate.role = newest.role
AND COALESCE(rate.client_company, 1) = COALESCE(newest.client_company, 1)
AND COALESCE(rate.client_group, 1) = COALESCE(newest.client_group, 1)
AND COALESCE(rate.client_contact, 1) = COALESCE(newest.client_contact, 1)
AND newest.date_from > rate.date_from
)
WHERE newest.id IS NULL