我在使用以下查询时遇到问题:
SELECT
job.name,
job_element.label,
job_element_role_hours.role,
job_element_role_hours.hours_budgeted,
latest_rate.hourly_rate,
( job_element_role_hours.hours_budgeted * latest_rate.hourly_rate ) AS line_cost
FROM
job_element
INNER JOIN job ON job_element.job = job.id
INNER JOIN job_element_role_hours ON job_element_role_hours.element = job_element.id
LEFT JOIN(
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
) AS latest_rate ON (
latest_rate.role = job_element_role_hours.role
AND (
COALESCE(latest_rate.client_company, 1) = COALESCE(job.client_company, 1)
OR latest_rate.client_company IS NULL
)
AND (
COALESCE(latest_rate.client_group, 1) = COALESCE(job.client_group, 1)
OR latest_rate.client_group IS NULL
)
AND (
COALESCE(latest_rate.client_contact, 1) = COALESCE(job.client_contact, 1)
OR latest_rate.client_contact IS NULL
)
)
WHERE job.id = 4
所以......这个查询获取一个作业的元素列表。每个元素都按“角色小时数”进行细分——例如,一个名为“构建 HTML 电子邮件”的元素可能有两个小时的设计师和两个小时的开发者——然后根据每个元素的小时费率计算成本角色。
问题是我将latest_rate子查询加入到主查询中。这是我的费率表:
'CREATE TABLE `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,
`last_edited_by` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
一个角色可能有多种费率:“全局”费率,其中设置了角色,但 client_company、client_group 和 client_contact 字段为 NULL;设置了角色和 client_company 但其他所有内容为 NULL 的公司特定费率,以及设置了角色、client_company 和 client_contact 但 client_group 为 NULL 的客户特定费率。
我想为“最接近”匹配为 Job 设置的 client_company、client_group 和 client_contact 的角色获得一个费率。因此,如果有一个设置了角色和 client_company 的 Rate 记录(并且 client_company 与 Job 匹配),我想要那个。否则,我将退回到带有 NULL client_company 的那个。
我的加入尝试显然是错误的:
AND (
COALESCE(latest_rate.client_company, 1) = COALESCE(job.client_company, 1)
OR latest_rate.client_company IS NULL
)
它将返回与 client_company 匹配或具有 NULL client_company 的所有记录。
我怎样才能得到它来获得最匹配的字段?
谢谢 :)