program tip

쉼표로 구분 된 문자열에서 값을 찾는 MySQL 쿼리

radiobox 2020. 10. 11. 10:06
반응형

쉼표로 구분 된 문자열에서 값을 찾는 MySQL 쿼리


COLORS (varchar(50))내 테이블 SHIRTS에와 같은 쉼표로 구분 된 문자열이 포함 된 필드 가 있습니다 1,2,5,12,15,. 사용 가능한 색상을 나타내는 각 숫자.

select * from shirts where colors like '%1%'모든 빨간색 셔츠 (color = 1)를 가져 오는 쿼리 실행할 때 색상이 회색 (= 12) 및 주황색 (= 15) 인 셔츠도 가져옵니다.

숫자 1을 포함하는 모든 색상이 아닌 색상 1 만 선택하도록 쿼리를 어떻게 다시 작성해야합니까?


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

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

그러나 find_in_set 도 작동합니다.

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

이 경우 FIND_IN_SET 은 친구입니다.

select * from shirts where FIND_IN_SET(1,colors) 

MySQL 용 FIND_IN_SET 함수를 살펴보십시오 .

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

이것은 확실히 작동하며 실제로 시도했습니다.

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)

시도 해봐 !!!


색상 세트가 다소 고정 된 경우 가장 효율적이고 가장 읽기 쉬운 방법은 앱에서 문자열 상수를 사용한 다음 쿼리에서 MySQL의 SET유형을 사용 FIND_IN_SET('red',colors)하는 것입니다. FIND_IN_SETSET 과 함께 유형을 사용할 때 MySQL은 하나의 정수를 사용하여 모든 값을 저장하고 이진 연산을 사용 하여 쉼표로 구분 된 문자열을 스캔하는 것보다 훨씬 효율적인 값의 존재 여부를 확인합니다."and"

에서 SET('red','blue','green'), 'red'내부적으로 저장됩니다 1, 'blue'로 내부에 저장 될 수 2'green'같이 내부적으로 저장됩니다 4. 값이 'red,blue'저장된다 3( 1|2)와 'red,green'같이 5( 1|4).


MySQL을 사용하는 경우 사용할 수있는 REGEXP 메서드가 있습니다.

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

따라서 다음을 사용합니다.

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

실제로 데이터베이스 스키마를 수정하여 세 개의 테이블을 만들어야합니다.

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

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

나를 위해 작동


다음 기능을 통해이를 달성 할 수 있습니다.

다음 쿼리를 실행하여 함수를 만듭니다.

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');

도움이 되길 바랍니다.


모든 답변이 정확하지 않습니다. 다음을 시도해보세요.

select * from shirts where 1 IN (colors);

참고 URL : https://stackoverflow.com/questions/5033047/mysql-query-finding-values-in-a-comma-separated-string

반응형