mysql - une - w3schools sql online editor




Renvoie le résultat par défaut pour la valeur IN indépendamment de (2)

J'ai une requête qui obtient tous les utilisateurs qui ont été en ligne entre une certaine plage de dates. Cela se fait via une requête IN en raison de la façon dont je veux afficher les données. Cependant, je voudrais renvoyer une valeur par défaut si aucun enregistrement n'a été trouvé pour un ID analysé dans la condition IN.

Requête simplifiée:

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

Désormais, la requête ci-dessus extraira uniquement les lignes répondant à la condition, comme prévu. Je voudrais également que la requête récupère une valeur par défaut pour les ID dans la condition IN qui ne répondent pas à la condition.

L'utilisation de IFNULL dans cette instance ne fonctionnera pas car l'enregistrement n'est jamais renvoyé

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 - J'analyse cette requête dans une fonction PDO personnalisée. Je n'utilise pas de fonctions mysql obsolètes


Lorsque vous utilisez LEFT JOIN vous devez définir les conditions de la deuxième table dans la clause ON . Les mettre dans la clause WHERE filtrer toutes les lignes sans correspondance, car ces colonnes auront la NULL et les conditions ne réussiront jamais.

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

Vous avez une condition sur OnlineUseage la jointure gauche devient comme une jointure interne.

déplacer votre condition à la clause from sera mieux:

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