복붙노트

[SQL] 쉼표에서 MySQL의 쿼리 찾는 값은 문자열을 분리

SQL

쉼표에서 MySQL의 쿼리 찾는 값은 문자열을 분리

나는 쉼표로 구분 된 문자열과 같은 1,2,5,12,15이 포함 된 내 테이블 셔츠 필드 COLORS (VARCHAR (50))이 ,. 사용 가능한 색상을 나타내는 각각의 번호입니다.

'% 1 %'와 같은 색상이 모두 빨간색 셔츠를 얻을 셔츠에서 쿼리를 선택합니다 * (색상 = 1)을 실행할 때, 나는 또한 색상이 회색 셔츠 (= 12), 오렌지 (= 15)을 얻는다.

그 선택 만 컬러 (1)이 아닌 숫자 1을 포함하는 모든 색상 그래서 어떻게 쿼리를 다시 작성해야합니까?

해결법

  1. ==============================

    1.고전적인 방법은 왼쪽과 오른쪽에 쉼표를 추가하는 것입니다 :

    고전적인 방법은 왼쪽과 오른쪽에 쉼표를 추가하는 것입니다 :

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

    그러나 FIND_IN_SET도 작동합니다 :

    select * from shirts where find_in_set('1',colors) <> 0
    
  2. ==============================

    2.FIND_IN_SET이 경우에 당신의 친구입니다

    FIND_IN_SET이 경우에 당신의 친구입니다

    select * from shirts where FIND_IN_SET(1,colors) 
    
  3. ==============================

    3.MySQL을위한 FIND_IN_SET 기능을 살펴보십시오.

    MySQL을위한 FIND_IN_SET 기능을 살펴보십시오.

    SELECT * 
        FROM shirts 
        WHERE FIND_IN_SET('1',colors) > 0
    
  4. ==============================

    4.이것은 확실히 작동합니다, 나는 실제로 그것을 밖으로 시도 :

    이것은 확실히 작동합니다, 나는 실제로 그것을 밖으로 시도 :

    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)
    

    시도 해봐 !!!

  5. ==============================

    5.색상 세트가 어느 정도 고정되어있는 경우, 가장 효율적이고 대부분의 읽을 수있는 방법은 쿼리 ( '붉은'색) 앱에서 문자열 상수를 사용하고 FIND_IN_SET와 MySQL을의 SET 유형을 사용하는 것입니다. FIND_IN_SET와 SET 타입을 사용할 때, MySQL은 모든 값을 저장하기 위해 하나 개의 정수를 사용하고, 콤마로 구분 된 문자열을 스캔하는 방법보다 더 효율적이다 값의 존재를 확인하기 위해 진 "및"동작을 사용한다.

    색상 세트가 어느 정도 고정되어있는 경우, 가장 효율적이고 대부분의 읽을 수있는 방법은 쿼리 ( '붉은'색) 앱에서 문자열 상수를 사용하고 FIND_IN_SET와 MySQL을의 SET 유형을 사용하는 것입니다. FIND_IN_SET와 SET 타입을 사용할 때, MySQL은 모든 값을 저장하기 위해 하나 개의 정수를 사용하고, 콤마로 구분 된 문자열을 스캔하는 방법보다 더 효율적이다 값의 존재를 확인하기 위해 진 "및"동작을 사용한다.

    SET에서 '빨간색'( '빨간색', '블루', '녹색')는 내부적으로 1로, '블루'2로 내부에 저장 될 것이고, '녹색'4 값 '빨간색으로 내부에 저장됩니다 저장됩니다 (| 4 일) 5로 '녹색, 빨간색 |, 파란색은'(2 일)와 3로 저장 될 것이다 '.

  6. ==============================

    6.당신이 MySQL을 사용하는 경우, 당신이 사용할 수있는 방법은 정규 표현식이있다 ...

    당신이 MySQL을 사용하는 경우, 당신이 사용할 수있는 방법은 정규 표현식이있다 ...

    http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

    그럼 당신은 사용합니다 :

    SELECT * FROM `shirts` WHERE `colors` REGEXP '\b1\b'
    
  7. ==============================

    7.당신은 실제로 당신이 세 개의 테이블이 그래서 데이터베이스 스키마를 수정해야합니다 :

    당신은 실제로 당신이 세 개의 테이블이 그래서 데이터베이스 스키마를 수정해야합니다 :

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

    당신은 빨간색 셔츠를 모두 찾으려면 다음, 당신은 같은 쿼리를 할 거라고 :

    SELECT *
    FROM shirt, color
    WHERE color.color_name = 'red'
      AND shirt.shirt_id = shirtcolor.shirt_id
      AND color.color_id = shirtcolor.color_id
    
  8. ==============================

    8.

    select * from shirts where find_in_set('1',colors) <> 0
    

    나를위한 작품

  9. ==============================

    9.당신은 기능에 따라이 작업을 수행 할 수 있습니다.

    당신은 기능에 따라이 작업을 수행 할 수 있습니다.

    함수를 만드는 쿼리를 다음 실행합니다.

    DELIMITER ||
    CREATE FUNCTION `TOTAL_OCCURANCE`(`commastring` TEXT, `findme`     VARCHAR(255)) RETURNS int(11)
    NO SQL
    -- SANI: First param is for comma separated string and 2nd for string to find.
    return ROUND (   
        (
            LENGTH(commastring)
            - LENGTH( REPLACE ( commastring, findme, "") ) 
        ) / LENGTH(findme)        
    );
    

    그리고이 같은이 함수를 호출

    msyql> select TOTAL_OCCURANCE('A,B,C,A,D,X,B,AB', 'A');
    

    그것은 도움이 줄 바랍니다.

  10. ==============================

    10.MySQL의 1. :

    MySQL의 1. :

    SELECT FIND_IN_SET(5, columnname) AS result 
    FROM table
    

    2.For PostgreSQL을 :

    SELECT * 
    FROM TABLENAME f
    WHERE 'searchvalue' = ANY (string_to_array(COLUMNNAME, ','))
    

    select * 
    from customer f
    where '11' = ANY (string_to_array(customerids, ','))
    
  11. ==============================

    11.모든 답변은 정말 정확하지 않습니다,이 시도 :

    모든 답변은 정말 정확하지 않습니다,이 시도 :

    select * from shirts where 1 IN (colors);
    
  12. from https://stackoverflow.com/questions/5033047/mysql-query-finding-values-in-a-comma-separated-string by cc-by-sa and MIT license