programing

SQL(MariaDB)에서 SELECT 문구가 중복되지 않도록 하는 방법

minecode 2023. 1. 4. 20:22
반응형

SQL(MariaDB)에서 SELECT 문구가 중복되지 않도록 하는 방법

저는 작은 MariaDB 데이터베이스로 작업하고 있습니다.사용자별 시간 간격을 추출하려면 다음 쿼리를 사용합니다.

SELECT
  SUM(TIMESTAMPDIFF(SECOND,Activity.startTime,Activity.endTime)) AS seconds,
  TIME_FORMAT(SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,Activity.startTime,Activity.endTime))),'%Hh %im %ss') AS formattedTime,
  TSUser.name
FROM Activity
INNER JOIN User ON User.id = Activity.userID
GROUP BY User.id
ORDER BY seconds DESC;

시간을 일반 초로 선택해야 합니다(... AS seconds(제 질문에서 알 수 있듯이, 그것을 통해 결과를 발주할 수 있도록 합니다.

단, MariaDB도 시간 간격을 포맷해 주었으면 합니다.그 때문에,TIME_FORMAT기능.문제는 이 모든 것을 복제해야 한다는 것이다.SUM(...)안에 있는 문구TIME_FORMAT다시 전화 주세요.이건 별로 우아해 보이지 않아요.MariaDB가 중복을 인식하여 계산합니까?SUM한 번만?또, 같은 결과를 얻을 수 있는 방법이 있습니까?SUM?

다음과 같은 네스트된 쿼리 구성에서는 이것이 가능해야 한다고 생각했습니다.

SELECT
  innerQuery.name,
  innerQuery.seconds,
  TIME_FORMAT(SEC_TO_TIME(innerQuery.seconds), '%Hh %im')
FROM (
  //Do the sum here, once.
) AS innerQuery
ORDER BY innerQuery.seconds DESC;

이것이 그것을 하는 가장 좋은 방법입니까? / "OK"?

주의: 결과에는 미가공 초수는 필요 없습니다.포맷된 시간만 있으면 됩니다.

도와주시면 감사하겠습니다.

아아. 좋은 해결책이 없어.하위 쿼리를 사용하면 MySQL과 마찬가지로 마리아Db가 하위 쿼리를 구현합니다.당신의 질문은 상당히 복잡하기 때문에 어쨌든 많은 I/O가 발생하고 있기 때문에 추가적인 구체화는 중요하지 않을 수 있습니다.

그 표현을 반복하는 것은 실제로 퍼포먼스보다 미학의 문제이다.식은 여러 번 다시 실행됩니다.다만, 집약을 실시하는데 드는 실제의 코스트는, 파일 정렬의 경우입니다.group by(또는 어떤 방법을 사용하든)를 하다sum()(집약함수뿐만 아니라 매우 비싼 함수를 호출하지 않는 한) 2배는 큰 문제가 되지 않습니다.

다른 데이터베이스 엔진은 서브쿼리를 자동으로 구현하지 않으므로 일반적으로 다른 데이터베이스에서 서브쿼리를 사용하는 것이 좋습니다.MariaDB/MySQL에서는 데이터와 리포트백 모두 사용할 수 있지만 식을 반복하는 것이 더 효율적이라고 생각합니다.

경우 원시 값은 필요하지 않습니다.포맷된 값은 에서 올바르게 동작합니다.ORDER BY.

2개의 쿼리를 사용하는 경우 오버헤드가 발생하기 때문에 서브쿼리 아이디어가 느려질 수 있습니다.

이것은 경험의 법칙입니다.MySQL은 행의 식을 평가하는 것보다 행을 가져오는 데 훨씬 많은 노력이 필요합니다.이 규칙에서는 중복된 표현은 부담이 되지 않습니다.

언급URL : https://stackoverflow.com/questions/36385865/how-to-avoid-duplicated-select-phrases-in-sql-mariadb

반응형