mysql - with - where com mais de uma condição sql




Retorna o resultado padrão para o valor IN, independentemente (2)

Quando você usa o LEFT JOIN você precisa colocar as condições na segunda tabela na cláusula ON . Colocá-los na cláusula WHERE filtra todas as linhas que não têm correspondências, porque essas colunas serão NULL e as condições nunca serão bem-sucedidas.

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,.........)

Eu tenho uma consulta que recebe todos os usuários que estiveram on-line entre um determinado período. Isso é feito por meio de uma consulta IN devido a como eu quero exibir os dados. No entanto, gostaria de retornar um valor padrão se nenhum registro foi encontrado para uma ID que foi analisada na condição IN.

Consulta Simplificada:

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,.........)

Agora, a consulta acima somente atrairá as linhas que atendem à condição, conforme o esperado. Também gostaria que a consulta extraísse um valor padrão para os IDs na condição IN que não atendam à condição.

Usando IFNULL neste exemplo não funcionará como o registro nunca é retornado

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,.........)

FYI - estou analisando essa consulta em uma função PDO personalizada. Eu não estou usando funções mysql obsoletas


Você tem uma condição em OnlineUseage a OnlineUseage à esquerda se torna como uma junção interna.

Mova sua condição para a cláusula de será melhor:

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






sql