MySQL是否选择CASE语句或ELSEIF?不知道怎么得到结果

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我有两张表。一个是制造商的信息,包括他们可以销售的地区。另一个有他们的产品出售。我们必须根据地区限制产品的可见性。这就像Netflix系统中的视频只能在任何地方观看(1),只在加拿大(2),只有在美国(3)。

我正在尝试进行一个查询,根据制造商表中的设置告诉我可以在哪里查看产品。

例如,在“制造商”表中,有两个名为“公开”的字段。用它们中的每一个都将有一个值为1,2或3,以限制他们的新视频或旧视频可以看到的地方。

当视频被添加时,它们没有被分配一个“公开”值,这意味着当将它们添加到我们的索引中时,这是动态的,这取决于当前制造商的公开。_新的或公开的_用过的值。

我试图得到的是项目的细节和计算的价值,它可以看到它是新的或使用的,以及规则/价值分配给制造商的所有新的或旧的产品。我需要在每件产品的基础上有条件地显示在列表中的这个个位数。

以下内容不起作用,但你会明白我想要做什么。我尝试过用案例陈述和以下错误的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)。我不确定我是否可以在每个语句中添加另一个测试,但它不会给出错误,只会给出错误的结果。

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
用户回答回答于

语法:

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

备选方案:

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

扫码关注云+社区