sourcecode

쉼표로 구분된 목록 MySQL에서 항목 수를 세는 방법

codebag 2023. 10. 20. 13:37
반응형

쉼표로 구분된 목록 MySQL에서 항목 수를 세는 방법

그래서 제 질문은 꽤 간단합니다.

SQL에 쉼표로 구분된 목록인 열이 있습니다(즉,cats,dogs,cows,) sql만 사용해서 그 안에 있는 아이템의 수를 세야 합니다. 그래서 제 기능이 무엇이든 간에 (지금은 fx라고 부르겠습니다.) 다음과 같이 작동합니다.

 SELECT fx(fooCommaDelimColumn) AS listCount FROM table WHERE id=...

나는 그것이 결함이 있다는 것을 알지만, 당신은 아이디어를 얻습니다 (BTW의 가치가 있다면).fooCommaDelimColumncats,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

반응형