쉼표로 구분 된 문자열에서 값을 찾는 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
'program tip' 카테고리의 다른 글
포인터 주소와 포인터 값을 증가시키는 방법은 무엇입니까? (0) | 2020.10.12 |
---|---|
Spark-앱을 제출할 때 "구성에 마스터 URL을 설정해야합니다"오류 (0) | 2020.10.11 |
다른 해상도 지원 안드로이드 (0) | 2020.10.11 |
파일에서 단일 속성 (예 : ReadOnly)을 제거하는 방법은 무엇입니까? (0) | 2020.10.11 |
psycopg2 설치 오류, -lssl에 대한 라이브러리를 찾을 수 없음 (0) | 2020.10.11 |