LEFT JOIN和多个条件mysql无法正常工作

时间:2018-02-19 23:21:15

标签: mysql sql

我在mysql中的这个SQL查询有问题

SELECT
g.PROFILE_INFO_ID,g.ADDRESS,
g.DATE_NAISS,g.CIN,g.PRENOM,
g.NOM,g.MLE_C,g.BADGE_ID,
g.GRADE_ID,g.SECTION_ID,
g.SERVICE_ID,lp.id_pointage,
lp.autorisation,lp.date_p_in,
lp.date_p_out,lp.image_p_in,
lp.image_p_out,lp.UNITE,
lp.ID_BADGE,lp.UNITE_ID
FROM
profile_info AS g
LEFT JOIN last_pointage AS lp ON g.BADGE_ID = lp.ID_BADGE
WHERE 
DATE_FORMAT((lp.date_p_in), '%d-%m-%Y') LIKE DATE_FORMAT((NOW()), '%d-%m-%Y')
AND (
g.SECTION_ID = (SELECT SECTION_ID from section WHERE section.SECTION_NAME like 'TOPO') and
g.SERVICE_ID = (SELECT SERVICE_ID from service WHERE service.SERVICE_NAME like 'SIGR')
)

查询结果为:

enter image description here

但当我删除日期条件:`DATE_FORMAT((lp.date_p_in),'%d-%m-%Y')LIKE DATE_FORMAT((NOW()),'%d-%m-%Y' )

SELECT
g.PROFILE_INFO_ID,g.ADDRESS,
g.DATE_NAISS,g.CIN,g.PRENOM,
g.NOM,g.MLE_C,g.BADGE_ID,
g.GRADE_ID,g.SECTION_ID,
g.SERVICE_ID,lp.id_pointage,
lp.autorisation,lp.date_p_in,
lp.date_p_out,lp.image_p_in,
lp.image_p_out,lp.UNITE,
lp.ID_BADGE,lp.UNITE_ID
FROM
profile_info AS g
LEFT JOIN last_pointage AS lp ON g.BADGE_ID = lp.ID_BADGE
WHERE 
 (
g.SECTION_ID = (SELECT SECTION_ID from section WHERE section.SECTION_NAME like 'TOPO') and
g.SERVICE_ID = (SELECT SERVICE_ID from service WHERE service.SERVICE_NAME like 'SIGR')
)`

我得到了我想要的但我希望今天结果的日期:

enter image description here

表格: enter image description here

你可以帮忙吗

2 个答案:

答案 0 :(得分:0)

除了第一个表格之外的所有条件,在一系列left join中,需要包含on子句,而不是where子句。

另外,你的日期算术很糟糕。你应该使用内置的日期/时间功能 - 这就是他们在那里的原因。所以from应该是这样的:

FROM profile_info g LEFT JOIN
     last_pointage lp
     ON g.BADGE_ID = lp.ID_BADGE AND
        lp.date_p_in = curdate()
WHERE . . .

如果date_p_in可以包含时间组件,请使用date()功能。

答案 1 :(得分:0)

如果您的查询的其余部分正在执行您想要的操作,请尝试

SELECT g.PROFILE_INFO_ID,
       g.ADDRESS,
       g.DATE_NAISS,
       g.CIN,
       g.PRENOM,
       g.NOM,
       g.MLE_C,
       g.BADGE_ID,
       g.GRADE_ID,
       g.SECTION_ID,
       g.SERVICE_ID,
       lp.id_pointage,
       lp.autorisation,
       lp.date_p_in,
       lp.date_p_out,
       lp.image_p_in,
       lp.image_p_out,
       lp.UNITE,
       lp.ID_BADGE,
       lp.UNITE_ID
FROM profile_info AS g
LEFT JOIN last_pointage AS lp ON g.BADGE_ID = lp.ID_BADGE
WHERE DATE(lp.date_p_in) = CURDATE()
  AND ( g.SECTION_ID =
         (SELECT SECTION_ID
          FROM SECTION
          WHERE section.SECTION_NAME LIKE 'TOPO')
       AND g.SERVICE_ID =
         (SELECT SERVICE_ID
          FROM service
          WHERE service.SERVICE_NAME LIKE 'SIGR') );

看起来date_p_in列中的日期是非常标准的格式,所以一个简单的方法可能是最好的(除非你期望某些日期是奇怪的格式?)。

您也可以像Gordon建议的那样将日期条件放在连接中,但是对于日期不是今天的所有行,您可能会在date_p_in列中获取所有具有空值的行。只是取决于你需要什么。