一个MySQL字段包含多个ID的解决方法

一个MySQL字段包含多个ID的解决办法

转自:http://database.51cto.com/art/201011/235339.htm

如果一个MySQL字段包含多个ID,应该如何解决呢?下面就为您介绍一个处理单个MySQL字段包含多个ID的处理方法,希望对您能有所启迪。

以下是一个MySQL字段包含多个ID的解决办法完整的例子。

1、新建表

    create table Category 

    ( 

       cateId                         int(5)                         not null AUTO_INCREMENT, 

       chiName                        varchar(80), 

       primary key (cateId) 

    ); 

    

    drop table if exists OpenRecord; 

    create table OpenRecord 

    ( 

       opreId                         int(5)                         not null AUTO_INCREMENT, 

       cateIds                        varchar(80), 

       primary key (opreId)                     

    ); 

    

2、初始化数据

    insert Category(chiName) values (‘fish’),(‘shrimp’),(‘crab’),(‘tiger’); 

    

    insert OpenRecord(cateIds) values(‘1,2’); 

    insert OpenRecord(cateIds) values(‘2,3’); 

    

3、查询OpenRecord中Id为1包括的Category。

#错误的方法

    select *  

        from Category 

        where (select INSTR(cateIds,cateId) from OpenRecord where opreId=1) 

#正确的方法

    select *  

        from Category 

        where (select FIND_IN_SET(cateId,cateIds) from OpenRecord where opreId=1) 

用INSTR会出现当ID大于10的时候,查ID为1的数据,会把1,10,11,12……的都拿出来。

4、扩展会出现的问题。

用FIND_IN_SET可以解决ID是用”,”号隔开的问题。然而会有另外的两种情况。

A、当ID不包含”,”,但是用别的符号分开时,如用”|”。我们有如下的解决办法

    select *  

        from Category 

        where (select FIND_IN_SET(cateId,REPLACE(cateIds,’|’,’,’)) from OpenRecord where opreId=1) 

如果你的这种情况的表很多。我们也可以把它写成函数。(MYSQL 5 下通过)

    DELIMITER $$ 

    

    DROP FUNCTION IF EXISTS fun_instr$$ 

    

    CREATE FUNCTION fun_instr(ns VARCHAR(100),s TEXT,isplit CHAR(1)) 

        RETURNS INT(8) 

        BEGIN 

    

            DECLARE strPosition INT(8); 

  

一个MySQL字段包含多个ID的解决方法

相关文章:

你感兴趣的文章:

标签云: