我在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')
)
查询结果为:
但当我删除日期条件:`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')
)`
我得到了我想要的但我希望今天结果的日期:
你可以帮忙吗答案 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列中获取所有具有空值的行。只是取决于你需要什么。