복붙노트

[SQL] IN 값에 대한 반환 기본 결과에 관계없이

SQL

IN 값에 대한 반환 기본 결과에 관계없이

나는 특정 날짜 범위 사이에 온라인되어있는 모든 사용자를 유도 할 수있는 쿼리가 있습니다. 이 인해 내가 데이터를 표시하는 방법에 IN 쿼리를 통해 이루어집니다. 그러나, 나는 더 레코드가 IN 조건에 해석 된 ID 찾을 수 없습니다 경우 기본 값을 반환하고 싶습니다.

간체 검색어 :

SELECT users.Name, users.ID, SUM(users.Minutes) AS MinutesOnline
     FROM UserTable
     LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
     WHERE OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
     AND UserTable.ID IN(332,554,5764,11,556,.........)
     GROUP BY users.ID
     ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)

이제 위의 쿼리는 예상대로 조건을 만족하는 행에서 가져옵니다. 또한 쿼리는 ID의 조건을 충족하지 않는 IN 조건 내에서의 기본값으로 끌어 당기는 것처럼.

레코드가 반환되지 않습니다으로이 경우에 IFNULL를 사용하면 작동하지 않습니다

SELECT users.Name, users.ID, IFNULL(SUM(users.Minutes), 0) AS MinutesOnline
     FROM UserTable
     LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
     WHERE OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
     AND UserTable.ID IN(332,554,5764,11,556,.........)
     GROUP BY users.ID
     ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)

참고 - 나는 정의 PDO 기능에이 쿼리를 구문 분석하고있다. 나는되지 MySQL의 기능을 사용하지 않는

해결법

  1. ==============================

    1.당신은 내부 조인처럼 OnlineUseage에 조건 왼쪽이 될 조인 있습니다.

    당신은 내부 조인처럼 OnlineUseage에 조건 왼쪽이 될 조인 있습니다.

    절에서 더 나은 될 것입니다에 당신의 상태를 이동 :

    SELECT
        users.Name,
        users.ID,
        IFNULL(SUM(users.Minutes), 0) AS MinutesOnline
    FROM
        users
        LEFT JOIN OnlineUseage ON
            OnlineUseage.ID = users.ID and
            OnlineUseage.Date >= '2016-01-01 00:00:00' AND
            OnlineUseage.Date <= '2016-12-31 23:59:59'
    WHERE
        users.ID IN (332,554,5764,11,556,.........)
    GROUP BY
        users.ID,users.Name
    ORDER BY
        users.ID
    
  2. ==============================

    2.당신이 LEFT를 사용하는 경우에는 ON 절에 두 번째 테이블에 조건을 넣어야 가입하세요. 에서 그들을 퍼팅 WHERE 그 열이 NULL되며 조건이 성공하지 못할 것입니다 때문에, 경기가없는 모든 행 아웃 조항 필터.

    당신이 LEFT를 사용하는 경우에는 ON 절에 두 번째 테이블에 조건을 넣어야 가입하세요. 에서 그들을 퍼팅 WHERE 그 열이 NULL되며 조건이 성공하지 못할 것입니다 때문에, 경기가없는 모든 행 아웃 조항 필터.

    SELECT users.Name, users.ID, IFNULL(SUM(OnlineUseage.Minutes), 0) AS MinutesOnline
    FROM UserTable
    LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
        AND OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
    WHERE UserTable.ID IN(332,554,5764,11,556,.........)
    GROUP BY UserTable.ID
    ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)
    
  3. from https://stackoverflow.com/questions/47449631/return-default-result-for-in-value-regardless by cc-by-sa and MIT license