/ / MySQL ayant si - mysql, sql, ayant, having-clause

MySQL ayant if - mysql, sql, having, having-clause

J'ai des problèmes avec une requête MySQL. Si le libellé est "5", je ne souhaite que les enregistrements contenant plus de 10 noms pour le jour en cours, mais un nombre quelconque de lignes pour les autres libellés. Quel est le meilleur moyen d'accomplir cela dans la requête?

SELECT id,name,label,date
FROM items
GROUP BY DATE("date"), label
HAVING COUNT(id) > 10 IF label = 5

Réponses:

3 pour la réponse № 1

Je le ferais en une seule requête:

SELECT id, name, label, date
FROM items
WHERE date >= date(now()) and date < date(now()) + interval 1 day
GROUP BY label
HAVING (label <> 5) or (COUNT(id) > 10);

Cela semble être la méthode la plus simple.


2 pour la réponse № 2
SELECT id,name,label,date
FROM items
WHERE label = 5 AND date = NOW()
GROUP BY  label
HAVING COUNT(id) > 10
UNION ALL
SELECT id,name,label,date
FROM items
WHERE  label != 5 AND date = NOW()
GROUP BY label
HAVING COUNT(id) > 0

Cela renverra des valeurs indéterminées pour les colonnes ne figurant pas dans GROUP BY.


1 pour la réponse № 3

Si je comprends bien votre question, cette requête vous donnera ce dont vous avez besoin.

Cette requête ne fonctionne que si la définition de la colonne "date" doit être de type date, sinon elle ne fonctionnera pas à moins que la colonne "date" ne soit convertie.

SELECT label, COUNT(id) AS total
FROM items
WHERE label = 5 AND date = CURDATE()
GROUP BY label
HAVING COUNT(id) > 10

La question est déroutante. basé sur votre commentaire essayez ceci

SELECTs.total, i.* FROM
items AS i
LEFT JOIN (
SELECT label, COUNT(id) AS total
FROM items
WHERE label = 5 AND date = CURDATE()
GROUP BY label
HAVING COUNT(id) > 10
) AS s ON s.label = i.label
WHERE date = CURDATE()