web-dev-qa-db-fra.com

Instruction de sélection MySQL avec CASE ou IF ELSEIF? Pas sûr de savoir comment obtenir le résultat

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

J'essaie de faire une requête qui m'indique où le produit peut être visualisé en fonction des paramètres dans la table de fabricant.

Par exemple, dans la table des fabricants, il existe deux champs appelés expos_new et expose_used, chacun d'eux ayant une valeur de 1,2 ou 3 afin de limiter les endroits où leurs vidéos nouvelles ou utilisées peuvent être visionnées.

Lorsque les vidéos sont ajoutées, aucune valeur "expose" ne leur est affectée. Cette opération doit être effectuée à la volée lors de leur ajout à notre index, en fonction des valeurs expose_new ou expose_used du fabricant actuel.

Ce que j'essaie d'obtenir, ce sont les détails de l'item et la valeur calculée pour savoir où il peut être vu en fonction de sa nouveauté ou de son utilisation, ainsi que la règle/valeur attribuée au fabricant pour tous ses produits neufs ou usés. J'ai besoin de ce chiffre unique pour chaque produit pour l'afficher de manière conditionnelle dans une liste.

Ce qui suit ne fonctionne pas, mais vous aurez l’idée de ce que j’essaie de faire. J'ai essayé ceci avec les déclarations CASE et la déclaration WRONG IF/ELSEIF suivante.

Toute aide pour résoudre ce problème et me diriger 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,  //can be new or used
(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 de CASE qui semble réellement s'exécuter mais donne toujours la première valeur, peu importe ce qui se produit (dans ce cas, 1). Je ne suis pas sûr de pouvoir ajouter un autre test avec AND dans chaque instruction WHEN, mais cela ne donne pas une erreur, mais un résultat erroné.

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
68
user409858

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
122
Devart

Syntaxe:

CASE value WHEN [compare_value] THEN result 
[WHEN [compare_value] THEN result ...] 
[ELSE result] 
END

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

mysql> SELECT CASE  WHEN 2>3 THEN 'this is true' ELSE 'this is false' END; 
+-------------------------------------------------------------+
| CASE  WHEN 2>3 THEN 'this is true' ELSE 'this is false' END |
+-------------------------------------------------------------+
| this is false                                               | 
+-------------------------------------------------------------+

je suis utiliser:

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<ses.session_date) THEN lises.location_id
    END AS location_id
FROM activity AS act
LEFT JOIN li_sessions AS lises ON lises.activity_id = act.id AND  lises.session_date >= now()
LEFT JOIN session AS ses ON  ses.activity_id = act.id AND  ses.session_date >= now()
WHERE act.id
17
Limitless isa

Une autre façon de faire consiste à utiliser des instructions IF imbriquées. Supposons que vous ayez une table de sociétés et que vous souhaitez compter le nombre d'enregistrements qu'elle contient. Un exemple de requête ressemblerait à ceci

SELECT IF(
      count(*) > 15,
      'good',
      IF(
          count(*) > 10,
          'average',
          'poor'
        ) 
      ) as data_count 
      FROM companies

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

1
Ali Hamza