web-dev-qa-db-ja.com

CASEまたはIF ELSEIFを使用したMySQL selectステートメント?結果を得る方法がわからない

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

製造元テーブルの設定に基づいて製品を表示できる場所を示すクエリを作成しようとしています。

たとえば、製造元のテーブルには、expose_newとexposed_usedという2つのフィールドがあり、それぞれのフィールドの値は1,2または3で、新しいビデオまたは使用したビデオの表示場所を制限します。

ビデオが追加されると、それらには「露出」値が割り当てられません。これは、現在の製造元のexpose_new値またはexpose_used値に応じてインデックスに追加するときにオンザフライで実行されることを意味します。

私が取得しようとしているのは、アイテムの詳細と、新品か使用済みか、すべての新製品または使用済み製品の製造元に割り当てられたルール/値に基づいて表示される計算値ですリストに条件付きで表示するには、製品ごとにこの1桁が必要です。

以下は機能しませんが、あなたは私がやろうとしていることのアイデアを得るでしょう。 CASEステートメントと次の間違った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

以下は実際に実行されるように見えるが、実際に何が起こっても常に最初の値になるケースバージョンです(この場合は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
66
user409858

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

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

構文:

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

代替: CASE WHEN [条件] THEN結果[WHEN [条件] THEN結果...]

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

私は使用しています:

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

これを行う別の方法は、ネストされたIFステートメントを使用することです。会社のテーブルがあり、その中のレコード数をカウントするとします。サンプルクエリは次のようになります

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

ここで、最初のIF条件が失敗すると、2番目のIF条件が機能します。したがって、IFステートメントのサンプル構文はIF(CONDITION、THEN、ELSE)。それが誰かに役立つことを願っています。

1
Ali Hamza