查询2个表之间的mysql连接

时间:2017-03-15 15:18:58

标签: mysql sql database

我有2张桌子

Matricule   date             presence minutes
248         31/01/2017         500
248         01/02/2017         400
248         02/02/2017         300

第二张表:

matricule  date_effet      time_passed_project
248        31/01/2017             250
248        31/01/2017             250
248        01/02/2017             300
248        02/02/2017             150
248        02/02/2017             100

我想要提取的是一个员工在项目上工作的日期少于他的存在,因为他知道一个员工可以在一天内在多个项目中工作,或者只在一个项目中工作,例如31/01/2017员工在2个项目中工作250和250,总数是500,就像第一个表一样,但在其余部分它与第一个表不一样,这是我要提取的日期,知道用户将选择一个范围日期例如,在这种情况下可能是2017年2月28日至2017年2月2日之间的日期

1 个答案:

答案 0 :(得分:0)

您可以分两步完成此操作。首先,将第二个表中每个日期(对于每个matricule)花费的总时间聚合为子查询。然后,将此子查询连接到第一个表,并保留那些工作时间小于存在时间的记录,并且匹配的记录也属于您指定的日期范围。

SELECT t1.matricule, t1.date, t1.`presence minutes`
FROM table1 t1
INNER JOIN
(
    SELECT matricule, date_effet, SUM(time_passed_project) AS total_time
    FROM table2
    GROUP BY matricule, date_effet
) t2
    ON t1.matricule = t2.matricule AND
       t1.date      = t2.date_effet
WHERE t2.total_time < t1.`presence minutes` AND
      t1.date BETWEEN '2017-01-28' AND '2017-02-02'

使用您提供的示例数据的上述查询的输出是以下两个日期:

01/02/2017
02/02/2017

作为旁注,如果您确实将日期存储为文本,这就是格式化建议的内容,您应该认真考虑使用日期类型,例如datetime。这样做可以更轻松地处理您的数据。减去WHERE子句,我的查询甚至可以使用文本日期。如果您的日期确实是文本,则可能必须使用以下内容替换WHERE子句:

WHERE STR_TO_DATE(t1.date, '%d/%m/%Y') BETWEEN '2017-01-28' AND '2017-02-02'

在这里演示:

Rextester