programing

이에 사용할 수 없는 구역.

projobs 2023. 6. 23. 23:36
반응형

이에 사용할 수 없는 구역.

데이터를 어떤 열에도 중복되지 않고 표시하고 싶습니다.

구분 또는 그룹별로 사용하고 있지만 작동하지 않습니다.

my sql :

SELECT DISTINCT rl.NIK,date(rl.enroll),LEFT(TIME(rl.enroll),8) AS time
FROM RTattandenceLog rl, mstEmp e
WHERE DATE(rl.enroll)=CURDATE()-1 AND e.idDept=3 AND e.NIK=rl.NIK

다음은 결과 c입니다.
enter image description here

교차한 선이 표시되지 않아야 합니다.

기본적으로 다음을 사용하여 집계 쿼리를 수행합니다.JOIN다음을 사용하는 대신 날짜/시간을 두 개의 열로 구분하는 이유를 잘 모르겠습니다.

SELECT rl.NIK, DATE(rl.enroll),
       CAST(MIN(TIME(rl.enroll)) as CHAR)
FROM RTattandenceLog rl JOIN
     mstEmp e
     ON e.NIK = rl.NIK
WHERE rl.enroll < CURDATE() AND
      rl.enroll >= CURDATE() - INTERVAL 1 DAY AND
      e.idDept = 3 
GROUP BY rl.NIK, DATE(rl.enroll);

주의:

  • 이것은 적절하고, 명시적이며, 표준적이고, 읽기 쉬운 것을 사용합니다.JOIN통사론에서 쉼표를 사용하지 않음FROM
  • 비교가 사용되지 않는 날짜DATE()따라서 인덱스와의 호환성이 향상되고 최적화 도구에 도움이 됩니다.
  • 의 암묵적인 변환은 없습니다.time값을 매겨 문자열로 만듭니다.왜 시간이 충분하지 않은지 모르겠어요 (date있는 것처럼 보임). 그러나 이것은 명시적으로 문자열로 변환됩니다.암시적 변환은 의미 오류와 성능 문제의 원인입니다.

저는 당신이 왜 날짜와 시간을 별도의 열로 나누려고 하는지 이해할 수 없습니다.이 정도면 충분할 것입니다.

SELECT rl.NIK, MIN(rl.enroll)
FROM RTattandenceLog rl JOIN
     mstEmp e
     ON e.NIK = rl.NIK
WHERE rl.enroll < CURDATE() AND
      rl.enroll >= CURDATE() - INTERVAL 1 DAY AND
      e.idDept = 3 
GROUP BY rl.NIK, DATE(rl.enroll);

실제로 NIK와 등록 날짜를 기준으로 여기에 그룹을 만들고 싶지 않습니까?그리고 모든 그룹의 가장 빠른 시간을 보여줍니까?

이와 같은 것:

SELECT rl.NIK, date(rl.enroll), LEFT(TIME(MIN(rl.enroll)), 8) AS time
FROM RTattandenceLog rl, mstEmp e
WHERE DATE(rl.enroll) = CURDATE() - 1 AND e.idDept = 3 AND e.NIK = rl.NIK
GROUP BY rl.NIK, date(rl.enroll)

저는 MariaDB를 직접 사용하지 않기 때문에 테스트할 수 없습니다.하지만 이것은 꽤 표준적인 SQL 구문이기 때문에 작동해야 한다고 생각합니다.

언급URL : https://stackoverflow.com/questions/67598298/distict-cant-use-in-this

반응형