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