107 votes

Déclaration SELECT MySQL avec CASE ou IF ELSEIF? Pas sûr de comment obtenir le résultat

J'ai deux tables. L'une contient des informations sur les fabricants et inclut les régions où ils peuvent vendre. L'autre contient leurs produits à vendre. Nous devons limiter la visibilité du produit en fonction des régions. C'est comme Netflix qui a des vidéos dans leur système qui ne peuvent être visionnées qu'partout (1), uniquement au Canada (2), uniquement aux États-Unis (3).

Je suis en train d'écrire une requête qui me dit où le produit peut être vu en fonction des paramètres de la table du fabricant.

Par exemple, dans la table du fabricant, il y a deux champs appelés expose_new et expose_used, chacun ayant une valeur de 1, 2 ou 3 pour limiter où leurs nouvelles ou vidéos d'occasion peuvent être vues.

Lorsque les vidéos sont ajoutées, elles ne se voient pas attribuer de valeur "expose", et cela doit être fait en temps réel lors de leur ajout à notre index en fonction des valeurs actuelles de "expose_new" ou "expose_used" du fabricant.

Ce que j'essaie d'obtenir, ce sont les détails de l'élément et la valeur calculée pour l'endroit où il peut être vu en fonction du fait que c'est nouveau ou d'occasion et de la règle / valeur attribuée au fabricant pour tous ses produits neufs ou d'occasion. J'ai besoin de ce chiffre unique sur une base par produit pour l'afficher conditionnellement dans une liste.

Le code suivant ne fonctionne pas, mais vous aurez une idée de ce que j'essaie de faire. J'ai essayé cela avec des déclarations CASE et la déclaration IF / ELSEIF suivante qui est incorrecte.

Toute aide pour déboguer ceci et me pointer dans la bonne direction serait appréciée.

SELECT 
t2.company_name,
t2.expose_new,  // 1,2 or 3
t2.expose_used, // 1,2 or 3
t1.title,
t1.seller,
t1.status,  //peut être nouveau ou d'occasion
(SELECT 
IF(status ='New',
  (select expose_new from manufacturers where id = t1.seller),1
)
ELSEIF(t1.status ='Used',
  (select expose_used from manufacturers where id = t1.seller),1
)
END IF
) as 'expose'
FROM `products` t1
join manufacturers t2 on t2.id = t1.seller
where t1.seller = 4238

Voici une version avec CASE qui semble en fait s'exécuter mais donne toujours la première valeur, peu importe ce qui est vrai (dans ce cas, 1). Je ne suis pas sûr de pouvoir ajouter un autre test avec le AND dans chaque instruction WHEN, mais cela ne donne pas une erreur, seulement le mauvais résultat.

SELECT 
t2.company_name,
t2.expose_new,
t2.expose_used,
t1.title,
t1.status,
 CASE status
   when 'New' and t2.expose_new = 1 then 1
   when 'New' and t2.expose_new = 2 then 2
   when 'New' and t2.expose_new = 3 then 3
   when 'Used' and t2.expose_used = 1 then 1
   when 'Used' and t2.expose_used = 2 then 2
   when 'Used' and t2.expose_used = 3 then 3
END as expose
FROM `products` t1
join manufacturers t2 on t2.id = t1.seller
where t1.seller = 4238

180voto

Devart Points 52715

Essayez cette requête -

SELECT 
  t2.company_name,
  t2.expose_new,
  t2.expose_used,
  t1.title,
  t1.seller,
  t1.status,
  CASE status
      WHEN 'New' THEN t2.expose_new
      WHEN 'Used' THEN t2.expose_used
      ELSE NULL
  END as 'expose'
FROM
  `products` t1
JOIN manufacturers t2
  ON
    t2.id = t1.seller
WHERE
  t1.seller = 4238

31voto

Limitless isa Points 270

Syntaxe:

CASE valeur WHEN [valeur_comparer] THEN résultat 
[WHEN [valeur_comparer] THEN résultat ...] 
[ELSE résultat] 
END

Alternative: CASE WHEN [condition] THEN résultat [WHEN [condition] THEN résultat ...]

mysql> SELECT CASE  WHEN 2>3 THEN 'c'est vrai' ELSE 'c'est faux' END; 
+-------------------------------------------------------------+
| CASE  WHEN 2>3 THEN 'c'est vrai' ELSE 'c'est faux' END |
+-------------------------------------------------------------+
| c'est faux                                               | 
+-------------------------------------------------------------+

J'utilise:

SELECT  act.*,
    CASE 
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NULL) THEN lises.location_id
        WHEN (lises.session_date IS NULL AND ses.session_date IS NOT NULL) THEN ses.location_id
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date>ses.session_date) THEN ses.location_id
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date= now()
LEFT JOIN session AS ses ON  ses.activity_id = act.id AND  ses.session_date >= now()
WHERE act.id

3voto

Ali Hamza Points 21

Une autre manière de faire cela est en utilisant des déclarations IF imbriquées. Supposons que vous avez une table d'entreprises et que vous voulez compter le nombre d'enregistrements. Une requête d'exemple ressemblerait à ceci

SELECT IF(
      count(*) > 15,
      'bon',
      IF(
          count(*) > 10,
          'moyen',
          'mauvais'
        ) 
      ) as data_count 
      FROM companies

Ici, la deuxième condition IF fonctionne lorsque la première condition IF échoue. Ainsi, la syntaxe d'exemple de l'instruction IF serait IF ( CONDITION, THEN, ELSE). J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X