sql—优化mysql中第二个表中最新数据的连接

pvcm50d1  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(227)

我们在优化一组都遵循相同模式的查询时遇到问题。
基本情况是我们有一张table( hours )它根据项目代码记录个人每周的工作时间。
我们还有第二张table( rates )记录每个人的历史小时工资。
我们要报工资总额( hours * rate )对于中的每个项目 hours table
返回我们感兴趣的所有小时数的查询是

SELECT hours_job, SUM(hour_value) AS total_hours
FROM hours_table
WHERE hours_job_status = "1"
GROUP BY hours_job

我们需要把它加入 rates table,最新的 rates_date 然而,在边缘情况下,个人在特定日期的利率可能大于1,在这些情况下,我们希望 MAX
这是当前的尝试,非常缓慢

SELECT hours_job, SUM(hour_value * rate_value) AS salary
FROM hours_table
JOIN rates_table ON rate_person_id = hours_person_id
WHERE hours_job_active = "1"
AND rate_date = (
  SELECT MAX(rate_date)
  FROM rates_table
  WHERE hours_person_id = rate_person_id
  AND hours_week >= rate_date
  AND rate_active = 1
)
AND rt_rate = (
  SELECT MAX(rate_value)
  FROM rates_table
  WHERE hours_person_id = rate_person_id
  AND hours_week >= rate_date
  AND rate_active = 1
GROUP BY hours_job
ORDER BY hours_job;

正如这里所建议的,这是一段数据和预期的结果
工时表

hours_id  hours_person_id  hours_week  hours_job  hours_value  hours_job_active
1  1  "2020-06-12"  100  20  1
2  1  "2020-06-12"  101  10  1
3  1  "2020-06-12"  102  10  1
4  2  "2020-06-12"  100  30  1
5  2  "2020-06-12"  102  10  1

费率表

rate_id  rate_person_id  rate_date  rate_value  rate_type  rate_active
1  1  "2020-04-01"  25.00  A  1
2  1  "2019-04-01"  20.00  A  1
3  1  "2018-04-01"  18.00  A  1
4  2  "2020-04-01"  20.00  A  1 
5  2  "2020-04-01"  18.00  Y  1

预期结果是

hours_job  salary
100  1100    ((20*25) + (30*20))
101  250     (10*25)
102  450     ((10*25) + (20*10))
lyr7nygr

lyr7nygr1#

我已经很久没有遇到过这样的问题需要优化了,没有测试db,我无法确保它能正常工作,但是你试过这样的方法吗?

SELECT hours_job, SUM(hour_value * MAX(rate_value)) AS salary
FROM hours_table
JOIN rates_table ON rate_person_id = hours_person_id
WHERE hours_job_active = "1"
AND hours_week >= rate_date
AND rate_active = 1
GROUP BY hours_job, rates_date
ORDER BY hours_job;

相关问题