MySQL query finding values in a comma separated string

后端 未结 11 1391
孤独总比滥情好
孤独总比滥情好 2020-11-21 23:40

I have a field COLORS (varchar(50)) in a my table SHIRTS that contains a comma delimited string such as 1,2,5,12,15,. Each number repr

相关标签:
11条回答
  • 2020-11-22 00:03

    You should actually fix your database schema so that you have three tables:

    shirt: shirt_id, shirt_name
    color: color_id, color_name
    shirtcolor: shirt_id, color_id
    

    Then if you want to find all of the shirts that are red, you'd do a query like:

    SELECT *
    FROM shirt, color
    WHERE color.color_name = 'red'
      AND shirt.shirt_id = shirtcolor.shirt_id
      AND color.color_id = shirtcolor.color_id
    
    0 讨论(0)
  • 2020-11-22 00:03
    select * from shirts where find_in_set('1',colors) <> 0
    

    Works for me

    0 讨论(0)
  • 2020-11-22 00:05

    The classic way would be to add commas to the left and right:

    select * from shirts where CONCAT(',', colors, ',') like '%,1,%'
    

    But find_in_set also works:

    select * from shirts where find_in_set('1',colors) <> 0
    
    0 讨论(0)
  • 2020-11-22 00:07

    FIND_IN_SET is your friend in this case

    select * from shirts where FIND_IN_SET(1,colors) 
    
    0 讨论(0)
  • 2020-11-22 00:11

    This will work for sure, and I actually tried it out:

    lwdba@localhost (DB test) :: DROP TABLE IF EXISTS shirts;
    Query OK, 0 rows affected (0.08 sec)
    
    lwdba@localhost (DB test) :: CREATE TABLE shirts
        -> (<BR>
        -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        -> ticketnumber INT,
        -> colors VARCHAR(30)
        -> );<BR>
    Query OK, 0 rows affected (0.19 sec)
    
    lwdba@localhost (DB test) :: INSERT INTO shirts (ticketnumber,colors) VALUES
        -> (32423,'1,2,5,12,15'),
        -> (32424,'1,5,12,15,30'),
        -> (32425,'2,5,11,15,28'),
        -> (32426,'1,2,7,12,15'),
        -> (32427,'2,4,8,12,15');
    Query OK, 5 rows affected (0.06 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    lwdba@localhost (DB test) :: SELECT * FROM shirts WHERE LOCATE(CONCAT(',', 1 ,','),CONCAT(',',colors,',')) > 0;
    +----+--------------+--------------+
    | id | ticketnumber | colors       |
    +----+--------------+--------------+
    |  1 |        32423 | 1,2,5,12,15  |
    |  2 |        32424 | 1,5,12,15,30 |
    |  4 |        32426 | 1,2,7,12,15  |
    +----+--------------+--------------+
    3 rows in set (0.00 sec)
    

    Give it a Try !!!

    0 讨论(0)
提交回复
热议问题