1. ホーム
  2. mysql

[解決済み] MySQL select statement with CASE or IF ELSEIF? 結果を取得する方法がわからない

2023-03-08 13:23:36

質問

2つのテーブルがあります。 1つはメーカー情報を持ち、販売可能な地域を含んでいます。 もう1つは、販売用の製品を持っています。 地域に基づいて製品の可視性を制限する必要があります。 これは、Netflix が、どこでも (1)、カナダ (2)、米国 (3) でしか見ることができないビデオをシステム内に持っているようなものです。

私は、製造者テーブルの設定に基づいて、製品がどこで見ることができるかを教えてくれるクエリを作ろうとしています。

たとえば、製造者テーブルには、expose_new と expose_used という 2 つのフィールドがあり、それぞれ 1,2 または 3 の値を持って、新しいビデオまたは使用済みのビデオを見ることができる場所を制限することができます。

動画が追加されるとき、「expose」値は割り当てられません。これは、現在のメーカーのexpose_newまたはexpose_usedの値に応じて、インデックスに動画を追加するときにその場で行われることを意味します。

私が取得しようとしているのは、アイテムの詳細と、新品か中古品かに基づいて見ることができる場所の計算された値、およびすべての新品または中古品のためにメーカーに割り当てられたルール/値です。 私はリストに条件付きで表示するために、製品ごとにこの一桁の数字が必要です。

以下はうまくいきませんが、私がやろうとしていることのアイデアを得ることができます。 私はこれを CASE ステートメントと次の WRONG IF/ELSEIF ステートメントで試してみました。

これをデバッグし、正しい方向に私を導くためのいかなる助けも感謝されます。

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

ここでは、実際に実行されているように見えるCASEバージョンですが、何が起こるか真であるかにかかわらず、常に最初の値(この場合、1)で結果を出します。 私は、各WHENステートメントでANDを持つ別のテストの追加を持つことができるかどうかわかりませんが、それはエラーを与えず、間違った結果だけを出します。

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

どのように解決するのですか?

このクエリを試してみてください。

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