如果数据存在则设置值的SQL查询

时间:2015-02-26 09:39:25

标签: mysql

这是小提琴; http://sqlfiddle.com/#!2/af8015/9

我有一些数据,我想设置

  • 如果user和g参数在名为cl的表中,则结果列应该是 是1;
  • 如果user和g参数在名为im的表中,但不在cl,result中 列应为-1;
  • 否则,结果列应为0

我正在使用以下查询;

select *,
    case cl.user_id
       when null then -1
       when im.user_id then 1
    end as result
from im
left join cl     on cl.user_id = im.user_id
                and cl.id_g = im.id_g
left join user   on user.user_id = im.user_id
left join g      on g.id_g = im.id_g

但是,它为-1返回null,并且我不能为最后一种情况设置0。

预期结果表是;

user id - g id - result
  1         1     1
  1         2     1
  1         3     0
  1         4     1
  2         1     1
  2         2     1
  2         3    -1
  2         4     0
...

1 个答案:

答案 0 :(得分:1)

我看不到从样本数据中生成0结果的方法。

我相信你的result参数应该像这样计算;

IF (cl.user_id IS NOT NULL and cl.id_g IS NOT NULL, 1,
    IF(im.user_id IS NOT NULL and im.id_g IS NOT NULL, -1,0)
   ) result

而且,我认为您的JOIN操作系列应该是这样的。

FROM user
LEFT JOIN im ON user.user_id = im.user_id
LEFT JOIN cl ON user.user_id = cl.user_id AND im.id_g = cl.id_g 
LEFT JOIN g  ON im.id_g = g.id_g

也就是说,你应该带着user表。这是一个例子:http://sqlfiddle.com/#!2/a5c6ef/1/0

您的result参数计算如下:

 case cl.user_id
    when null then -1
    when im.user_id then 1
 end as result

null值很奇怪。 null值永远无法与任何内容进行比较,即使是另一个null值也是如此,因此when null then -1永远不会触发。另一方面,这个表达式应该可行。

 case when cl.user_id IS NULL then -1
      when im.user_id IS NULL then 1
      else 0 end as result