복붙노트

[SQL] 쉼표로 구분 된 목록의 MySQL의 항목을 계산하는 방법

SQL

쉼표로 구분 된 목록의 MySQL의 항목을 계산하는 방법

그래서 제 질문은 아주 간단입니다 :

내가 (즉, 고양이, 개, 소,) 난 단지 SQL 사용하여 항목의 수를 계산해야하는 쉼표로 구분 된 목록입니다 SQL에 열이 (나의 기능 (작동 것입니다) 지금 (fx)가 호출 할 수 있습니다 무엇이든 이 같은 :

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

나는 그 결함이 있음을 알고,하지만 당신은 아이디어를 얻을 (fooCommaDelimColumn의 값이 고양이, 개, 소입니다 BTW 경우 ,, 다음 listCount는 ... 4를 반환해야합니다).

그게 전부입니다.

해결법

  1. ==============================

    1.어떤이 내장되지-에 카운트 문자열의 하위 문자열의 발생하지만, 당신이 원래 문자열의 차이, 쉼표없이 같은 문자열을 계산할 수있는 기능 :

    어떤이 내장되지-에 카운트 문자열의 하위 문자열의 발생하지만, 당신이 원래 문자열의 차이, 쉼표없이 같은 문자열을 계산할 수있는 기능 :

    LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn, ',', ''))
    

    그것은 지금은 거의 팔년의 과정을 통해 여러 번 편집 한 (와우!), 그래서 명확 위해 : OPS 데이터가 추가 콤마을 가지고 있기 때문에 위의 쿼리는 + 1을 필요로하지 않습니다.

    실제로 있지만, 문자열에 대한 일반적인 경우이 같다고 : 푸, 바, 정확한 표현이 될 것이다 바즈

    LENGTH(col) - LENGTH(REPLACE(col, ',', '')) + 1
    
  2. ==============================

    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. ==============================

    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. ==============================

    4.이 버전은 선행 또는 쉼표를 후행 지원하지만 0의 수와 빈 값을 지원하지 않습니다

    이 버전은 선행 또는 쉼표를 후행 지원하지만 0의 수와 빈 값을 지원하지 않습니다

    IF(values, LENGTH(values) - LENGTH(REPLACE(values, ',', '')) + 1, 0) AS values_count
    
  5. ==============================

    5.대답은 데이터베이스 스키마를 수정하는 것입니다. 그것은 접합 테이블을 필요로하는 다 대다 관계처럼 들린다. http://en.wikipedia.org/wiki/Junction_table

    대답은 데이터베이스 스키마를 수정하는 것입니다. 그것은 접합 테이블을 필요로하는 다 대다 관계처럼 들린다. http://en.wikipedia.org/wiki/Junction_table

  6. from https://stackoverflow.com/questions/7020001/how-to-count-items-in-comma-separated-list-mysql by cc-by-sa and MIT license