쉼표로 구분된 목록 MySQL에서 항목 수를 세는 방법
그래서 제 질문은 꽤 간단합니다.
SQL에 쉼표로 구분된 목록인 열이 있습니다(즉,cats,dogs,cows,
) sql만 사용해서 그 안에 있는 아이템의 수를 세야 합니다. 그래서 제 기능이 무엇이든 간에 (지금은 fx라고 부르겠습니다.) 다음과 같이 작동합니다.
SELECT fx(fooCommaDelimColumn) AS listCount FROM table WHERE id=...
나는 그것이 결함이 있다는 것을 알지만, 당신은 아이디어를 얻습니다 (BTW의 가치가 있다면).fooCommaDelimColumn
가cats,dogs,cows,
, 그런 다음 listCount가 4를 반환해야 합니다...).
그게 다야.
문자열에 부분 문자열이 발생하는 경우를 세는 기본 함수는 없지만 원래 문자열과 쉼표가 없는 동일한 문자열 간의 차이를 계산할 수 있습니다.
LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn, ',', ''))
현재 거의 8년에 걸쳐 여러 번 편집되었습니다.(wow!), 명확성을 위해 위의 쿼리는 다음을 필요로 하지 않습니다.+ 1
, OPs 데이터에 추가 후행 쉼표가 있기 때문입니다.
한편, 일반적으로 다음과 같은 문자열의 경우:foo,bar,baz
정확한 표현은
LENGTH(col) - LENGTH(REPLACE(col, ',', '')) + 1
Zerkms의 해결책은 효과가 있습니다. 의심할 여지 없이 말입니다.하지만 Steve Wellens가 지적한 것처럼 잘못된 데이터베이스 스키마에 의해 문제가 생성됩니다.첫 번째 정규 법칙을 위반하므로 한 열에 두 개 이상의 값을 가져서는 안 됩니다.대신에, 최소한 두 개의 테이블을 만들어야 합니다.예를 들어, 동물을 소유한 회원이 있다고 가정해 보겠습니다.
table member (member_id, member_name)
table member_animal (member_id, animal_name)
더 좋은 점: 많은 사용자들이 같은 종류의 동물을 가질 수 있기 때문에, 당신은 3개의 표를 만들어야 합니다:
table member (member_id, member_name)
table animal (animal_id, animal_name)
table member_animal (member_id, animal_id)
예를 들어, 테이블을 다음과 같이 채울 수 있습니다.
member (1, 'Tomas')
member (2, 'Vincent')
animal (1, 'cat')
animal (2, 'dog')
animal (3, 'turtle')
member_animal (1, 1)
member_animal (1, 3)
member_animal (2, 2)
member_animal (2, 3)
그리고, 처음 질문에 답하자면, 각 사용자가 몇 마리의 동물을 가지고 있는지 알고 싶다면 다음과 같이 하십시오.
SELECT member_id, COUNT(*) AS num_animals
FROM member
INNER JOIN member_animal
USING (member_id)
INNER JOIN animal
USING (animal_id)
GROUP BY member_id;
@zerkms의 제안을 따릅니다.
후행 쉼표가 있는지 없는지 모르는 경우 TRIM 기능을 사용하여 후행 쉼표를 제거합니다.
(
LENGTH(TRIM(BOTH ',' FROM fooCommaDelimColumn))
- LENGTH(REPLACE(TRIM(BOTH ',' FROM fooCommaDelimColumn), ',', ''))
+ 1
) as count
참조 : http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim
또한 표를 리팩토링하는 것이 최선의 선택이라는 것에 동의하지만, 만약 지금 이것이 불가능하다면, 이 토막글은 작업을 할 수 있습니다.
이 버전에서는 선행 또는 후행 쉼표를 지원하지 않지만 카운트가 0인 빈 값을 지원합니다.
IF(values, LENGTH(values) - LENGTH(REPLACE(values, ',', '')) + 1, 0) AS values_count
정답은 데이터베이스 스키마를 수정하는 것입니다.연결표가 필요한 다대다의 관계로 들립니다.http://en.wikipedia.org/wiki/Junction_table
+1을 하고 빈 열이 있으면 항상 1이 되어 0이 됩니다. mySQL에서 IF 조건을 사용할 수 있습니다.
IF(LENGTH(column_name) > 0, LENGTH(column_name) - LENGTH(REPLACE(column_name, ',', '')) + 1, 0)
언급URL : https://stackoverflow.com/questions/7020001/how-to-count-items-in-comma-separated-list-mysql
'sourcecode' 카테고리의 다른 글
PowerShell에서 EXE 출력 캡처 (0) | 2023.10.20 |
---|---|
따옴표가 있는 URL을 표시하는 입력 필드 (0) | 2023.10.20 |
jsch를 통해 실행하면 자바 프로그램과 mariadb 연결이 되지 않습니다. (0) | 2023.10.20 |
SQL에서 출력을 정수로 선택/캐스팅 (0) | 2023.10.20 |
PowerShell에서 객체의 여러 항목을 합산하는 방법? (0) | 2023.10.20 |