在mysql查询条件where中使用case根据字段条件查询


在使用mysql的时候有时候会遇到,根据字段的不同值产生不同的判断条件,也就是在mysql查询条件where中使用case根据字段条件查询
查找相关文章:mysql where case

在使用mysql的时候有时候会遇到,根据字段的不同值产生不同的判断条件,也就是在mysql查询条件where中使用case根据字段条件查询

也许这样说的时候,意思还是表达不清楚,来看个需求吧

我有2个表

--
-- 表的结构 `advertiser_category_brand`
--

CREATE TABLE IF NOT EXISTS `advertiser_category_brand` (
  `advertiser_id` int(11) NOT NULL COMMENT '广告主id',
  `ad_category_id` int(11) NOT NULL COMMENT '分类id',
  `ad_brand_id` int(11) NOT NULL COMMENT '品牌id'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='广告主品类品牌绑定表';

--
-- 转存表中的数据 `advertiser_category_brand`
--

INSERT INTO `advertiser_category_brand` (`advertiser_id`, `ad_category_id`, `ad_brand_id`) VALUES
(32, 33, 0),
(58, 25, 22),
(61, 31, 23),
(63, 41, 34),
(67, 33, 24);
--
-- 表的结构 `ad_brand`
--

CREATE TABLE IF NOT EXISTS `ad_brand` (
  `ad_brand_id` int(11) NOT NULL COMMENT '广告品牌id',
  `ad_brand_name` varchar(40) NOT NULL DEFAULT '' COMMENT '广告品牌名称',
  `ad_category_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '品牌所属分类id'
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='广告品牌';

--
-- 转存表中的数据 `ad_brand`
--

INSERT INTO `ad_brand` (`ad_brand_id`, `ad_brand_name`, `ad_category_id`) VALUES
(8, '小米手机', 36),
(7, '华为手机', 36),
(6, '海飞丝', 25),
(9, '三星手机', 36),
(10, '苹果手机', 36),
(11, '博朗', 28),
(12, '玉兰油', 29),
(13, '天翼手机', 36),
(14, '一汽大众', 30),
(15, '网易游戏', 31),
(16, '78游戏中心', 31),
(17, 'QQ空间游戏', 31),
(18, '特仑苏', 32),
(19, '唯品会', 33),
(20, '广发银行', 34),
(21, '建设银行', 34),
(22, '力士LUX', 25),
(23, '谷果游戏广告平台', 31),
(24, '大众点评', 35),
(25, '快的', 35),
(26, 'Intel英特尔', 36),
(27, '北联', 38),
(28, 'Mobvista', 31),
(29, '阳狮', 38),
(30, 'Miaozhen', 38),
(31, '品友互动', 41),
(32, '多盟', 39),
(33, 'MediaV', 41),
(34, '舜飞BiddingX', 41),
(35, '测聘网', 42),
(36, 'RTBChina', 41),
(37, 'Ad7', 41),
(38, 'INFIPLAY.RU', 31),
(39, '有爱互动', 31),
(40, '奥奇智慧OKidea', 38);

其中表advertiser_category_brand中如果ad_brand_id字段值为0则表示ad_category_id下的所有ad_brand_id都关联了


查询SQL如下 注意case end用括号包含起来,不然会出错

SELECT advertiser_category_brand.advertiser_id,GROUP_CONCAT(ad_brand.ad_brand_name) as brandname 
FROM advertiser_category_brand LEFT JOIN ad_brand ON(advertiser_category_brand.ad_category_id = ad_brand.ad_category_id ) 
WHERE (CASE WHEN advertiser_category_brand.ad_brand_id>0 THEN advertiser_category_brand.ad_brand_id=ad_brand.ad_brand_id ELSE TRUE END) 
GROUP BY advertiser_category_brand.advertiser_id


当然还有一个数据库的解决办法,就是advertiser_category_brand表中ad_brand_id不要存储0,全部都存储有关联的值,这样解决应该会比较好,但因为较多的地方使用了该数据库,如果改动存储方式,前端也需要更改,懒人办法.