2

我有两个表名为

产品分类

CREATE TABLE `product_category` (
  `pid` int(11) NOT NULL,
  `cid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `product_category`
--

/*!40000 ALTER TABLE `product_category` DISABLE KEYS */;
INSERT INTO `product_category` (`pid`,`cid`) VALUES 
 (1,1),
 (2,3),
 (3,2),
 (4,2),
 (5,3),
 (1,2),
 (2,4),
 (3,1);

类别

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(50) NOT NULL,
  `mapped_cat_id` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `category`
--

/*!40000 ALTER TABLE `category` DISABLE KEYS */;
INSERT INTO `category` (`id`,`cat_name`,`mapped_cat_id`) VALUES 
 (1,'c1','1,2,4'),
 (2,'c2','2,3'),
 (3,'c3','3,4'),
 (4,'c4','4,1,3');
/*!40000 ALTER TABLE `category` ENABLE KEYS */;

当我运行这个查询

select distinct pid from
product_category where cid in (1,2,4)

我得到了 pid (1,3,4,2) 的结果

但是当我运行查询时

select distinct pid from
product_category where cid in (select mapped_cat_id from category where id=1)

我得到了 pid (1,3) 的结果

如何使用带有“IN”子句的子查询?

我知道我提出问题的方式是错误的,因为我不知道如何在这里创建表,这就是我写查询而不是表的原因。

4

2 回答 2

2

我认为逗号分隔值不好。删除category表的内容并使用以下查询插入

INSERT INTO `category` (`id`, `cat_name`, `mapped_cat_id`) VALUES
    (1, 'c1', '1'),
    (2, 'c2', '2'),
    (3, 'c3', '3'),
    (4, 'c4', '4'),
    (5, 'c1', '2'),
    (6, 'c1', '4'),
    (7, 'c2', '3'),
    (8, 'c3', '4'),
    (9, 'c4', '1'),
    (10, 'c4', '3');

然后使用以下查询来获取您的结果

select distinct pid from 
product_category where cid in 
(select mapped_cat_id from category where cat_name='c1')
于 2013-09-04T04:34:49.033 回答
0

您可能正在寻找FIND_IN_SET()函数

select distinct pid from
product_category where FIND_IN_SET(cid,
(select mapped_cat_id from category where id=1));

样品小提琴

由于 mapped_cat_id 保存为逗号分隔值(varchar),因此它仅采用第一个整数进行条件检查。这里是 1

于 2013-09-04T04:36:20.140 回答