MySQL select语句是CASE还是IF ELSEIF?不确定如何获得结果


78

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

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

例如,在制造商表中,有两个字段称为Exposure_new和Exposure_used,每个字段的值为1,2或3,以限制可以看到其新视频或使用过的视频的位置。

添加视频后,不会为它们分配“曝光”值,这是根据当前制造商的Exposure_new或Exposure_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

是关于mysql的非常好的资源,如果不是,则为case语句。都用示例进行解释。
RN库什瓦哈2015年

Answers:


136

试试这个查询-

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

十字问-查询FROM products t1, manufacturers t2 where t2.id = t1.seller and t1.seller = 4238是否相同?这只是LEFT加入,不是吗?
别有用心

1
事实证明,在进行实验时,我找到了一种使用CASE ... CASE的方法,当status ='New'且t2.expose_new = 1时,则为1,而当status ='New'且t2.expose_new = 2则2时,等等。通过简单地说明不带字段的CASE,我可以在每个when语句中定义它们,并且可以正常工作。
user409858 2011年

1
expose在哪里条件下如何使用?
NullPointer 2014年

尊敬的NullPointer您可以解决我的问题吗?我可以使用案例加入其他表格吗?这样的事情。在o.code = l.code上键入type ='top'INNER JOIN lam1 AS l时选择日期,名称,代码,类型CASE ELSE NULL END CASE typo ='reverse'在o.code = l2.code上使用INNER JOIN lam2 AS l2订单AS o中的ELSE NULL END
Syed Arif Iqbal 2014年

19

句法:

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

1

另一种方法是使用嵌套的IF语句。假设您有公司表,并且想要计算其中的记录数。一个示例查询将是这样的

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

当第一个IF条件失败时,第二个IF条件将起作用。因此,IF语句的示例语法将为IF(CONDITION,THEN,ELSE)。 希望它能帮助某人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.