[SQL] 쉼표로 구분 된 목록의 MySQL의 항목을 계산하는 방법
SQL쉼표로 구분 된 목록의 MySQL의 항목을 계산하는 방법
그래서 제 질문은 아주 간단입니다 :
내가 (즉, 고양이, 개, 소,) 난 단지 SQL 사용하여 항목의 수를 계산해야하는 쉼표로 구분 된 목록입니다 SQL에 열이 (나의 기능 (작동 것입니다) 지금 (fx)가 호출 할 수 있습니다 무엇이든 이 같은 :
SELECT fx(fooCommaDelimColumn) AS listCount FROM table WHERE id=...
나는 그 결함이 있음을 알고,하지만 당신은 아이디어를 얻을 (fooCommaDelimColumn의 값이 고양이, 개, 소입니다 BTW 경우 ,, 다음 listCount는 ... 4를 반환해야합니다).
그게 전부입니다.
해결법
-
==============================
1.어떤이 내장되지-에 카운트 문자열의 하위 문자열의 발생하지만, 당신이 원래 문자열의 차이, 쉼표없이 같은 문자열을 계산할 수있는 기능 :
어떤이 내장되지-에 카운트 문자열의 하위 문자열의 발생하지만, 당신이 원래 문자열의 차이, 쉼표없이 같은 문자열을 계산할 수있는 기능 :
LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn, ',', ''))
그것은 지금은 거의 팔년의 과정을 통해 여러 번 편집 한 (와우!), 그래서 명확 위해 : OPS 데이터가 추가 콤마을 가지고 있기 때문에 위의 쿼리는 + 1을 필요로하지 않습니다.
실제로 있지만, 문자열에 대한 일반적인 경우이 같다고 : 푸, 바, 정확한 표현이 될 것이다 바즈
LENGTH(col) - LENGTH(REPLACE(col, ',', '')) + 1
-
==============================
2.zerkms '솔루션은, 그것에 대해 의심의 여지가 작동합니다. 스티브 Wellens 지적 그러나 문제는, 잘못된 데이터베이스 스키마에 의해 생성됩니다. 이 첫 정상 법을 나누기 때문에 하나의 열에서 하나 개 이상의 값을 가질 것이다. 대신, 당신은 적어도 두 개의 테이블을 만들어야합니다. 예를 들어, 당신이 멤버 누가 자신의 동물을 가정 해 봅시다 :
zerkms '솔루션은, 그것에 대해 의심의 여지가 작동합니다. 스티브 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;
-
==============================
3.@zerkms의 제안에 따라.
@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
또한 테이블의 리팩토링이 최선의 선택임을 동의하지만이 이제 가능하지 않은 경우,이 조각은 작업을 할 수 있습니다.
-
==============================
4.이 버전은 선행 또는 쉼표를 후행 지원하지만 0의 수와 빈 값을 지원하지 않습니다
이 버전은 선행 또는 쉼표를 후행 지원하지만 0의 수와 빈 값을 지원하지 않습니다
IF(values, LENGTH(values) - LENGTH(REPLACE(values, ',', '')) + 1, 0) AS values_count
-
==============================
5.대답은 데이터베이스 스키마를 수정하는 것입니다. 그것은 접합 테이블을 필요로하는 다 대다 관계처럼 들린다. http://en.wikipedia.org/wiki/Junction_table
대답은 데이터베이스 스키마를 수정하는 것입니다. 그것은 접합 테이블을 필요로하는 다 대다 관계처럼 들린다. http://en.wikipedia.org/wiki/Junction_table
from https://stackoverflow.com/questions/7020001/how-to-count-items-in-comma-separated-list-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 행의 집합에 누적 합계 (0) | 2020.04.08 |
---|---|
[SQL] SELECT *에 대한 바로 가기가 FROM 있습니까? (0) | 2020.04.08 |
[SQL] 추가 (별개의) 필터를 집계 열 (0) | 2020.04.08 |
[SQL] 무엇을 의미 = *는 무엇입니까? (0) | 2020.04.08 |
[SQL] 와이즈 최대 (0) | 2020.04.08 |