一、说明
当在一张表的某个字段中存储了另外一张表的多个ID时常用查询
二、准备
假设有一博客,每一个主题允许有多个类别。数据库设计时建了类别和主题两张表,主题对类别的关联设置在主题表中。
-
- CREATE TABLE `T_CATEGORYS` (
- `C_ID` int(11) NOT NULL,
- `C_NAME` varchar(255) NOT NULL,
- PRIMARY KEY (`C_ID`)
- )
-
- CREATE TABLE `T_TOPIC` (
- `T_ID` int(11) NOT NULL,
- `T_NAME` varchar(255) NOT NULL,
- `T_CATEGORYS` varchar(128) NOT NULL,
- PRIMARY KEY (`T_ID`)
- )
-
- INSERT INTO `T_CATEGORY` (`C_ID`, `C_NAME`) VALUES ('1', 'Struts');
- INSERT INTO `T_CATEGORY` (`C_ID`, `C_NAME`) VALUES ('2', 'Spring');
- INSERT INTO `T_CATEGORY` (`C_ID`, `C_NAME`) VALUES ('3', 'iBatis');
- INSERT INTO `T_CATEGORY` (`C_ID`, `C_NAME`) VALUES ('4', 'Hibernate');
-
- INSERT INTO `xilen_dev`.`T_TOPIC` (`T_ID`, `T_NAME`, `T_CATEGORYS`) VALUES ('1', 'SSI整合示例', '1,2,3');
- INSERT INTO `xilen_dev`.`T_TOPIC` (`T_ID`, `T_NAME`, `T_CATEGORYS`) VALUES ('2', 'SSH整合示例', '1,2,4');
三、查询
1、查询多ID的字段中包含某个ID的记录
SQL:
-
- SELECT * FROM T_TOPIC WHERE FIND_IN_SET(3, T_CATEGORYS)
结果:
2、查询多ID字段中这些ID所代表的记录
SQL:
-
- SELECT * FROM T_CATEGORY c WHERE (SELECT FIND_IN_SET(c.C_ID,t.T_CATEGORYS) from T_TOPIC t where t.T_ID=2)
结果:
3、查询时将多ID的字段的ID转换为对应的标识
SQL:
-
- SELECT t.T_ID AS topicId,
- (SELECT GROUP_CONCAT(c.C_NAME) FROM T_CATEGORY c WHERE FIND_IN_SET(c.C_ID,t.T_CATEGORYS)) AS categoryName
- FROM T_TOPIC t
结果:
4、补充
FIND_IN_SET函数默认是以符号 , 作为分割符的,如果多ID字段使用的这个默认的分隔符,而是以如 | 的符号作为分隔符,那么:
-
- SELECT * FROM T_TOPIC WHERE FIND_IN_SET(3, REPLACE(T_CATEGORYS,'|',','))