【发布时间】:2012-10-03 11:51:52
【问题描述】:
以下查询有问题:
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 的客户特定费率。
我想获得与作业的 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 的所有记录。
我怎样才能得到匹配字段最多的那个?
谢谢:)
【问题讨论】: