>데이터 베이스 >MySQL 튜토리얼 >MySQL FIND_IN_SET() 대 IN(): IN()이 쉼표로 구분된 ID와 첫 번째 일치 항목만 반환하는 이유는 무엇입니까?

MySQL FIND_IN_SET() 대 IN(): IN()이 쉼표로 구분된 ID와 첫 번째 일치 항목만 반환하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-11 10:40:12606검색

MySQL FIND_IN_SET() vs IN(): Why Does IN() Only Return the First Match with Comma-Separated IDs?

FIND_IN_SET()과 IN(): MySQL의 차이점 이해

질문:

MySQL에는 "주문"과 "회사"라는 두 개의 테이블이 있습니다. "orders"의 "attachedCompanyIDs" 열은 "company"의 행을 참조하는 쉼표로 구분된 ID 목록을 저장합니다. FIND_IN_SET()을 사용하여 주문과 관련된 회사 이름을 쿼리하면 예상한 결과를 얻습니다. 그러나 IN()을 대신 사용하면 첫 번째로 일치하는 회사만 반환됩니다. 왜 이런 일이 발생합니까?

답변:

attachedCompanyIDs 열은 VARCHAR 유형의 스칼라 값입니다. IN()을 사용할 때 MySQL은 문자열을 정수로 변환하고 숫자가 아닌 첫 번째 문자(예: 쉼표)에서 문자열을 자릅니다. 즉, attachmentCompanyID에 여러 값이 포함된 경우 첫 번째 값만 IN 비교에 고려됩니다.

解决方法:

특정 시나리오에 따라 다음이 있습니다. 이 문제에 대한 몇 가지 해결 방법:

  1. ARRAY 사용 유형(PostgreSQL에만 해당): PostgreSQL은 배열 데이터 유형을 지원하므로 쉼표로 구분된 목록을 배열로 저장할 수 있습니다. 이를 통해 ANY()를 사용하여 attachmentCompanyIDs의 값을 companyID 열과 정확하게 비교할 수 있습니다.
  2. 제한된 값 목록: attachmentCompanyIDs의 쉼표로 구분된 목록 길이가 제한되어 있는 경우 일련의 UNION ALL 쿼리를 사용하여 문자열을 여러 행으로 변환할 수 있습니다. 이를 통해 각 행에서 개별적으로 IN 비교를 수행할 수 있습니다.

추가 고려 사항:

  1. 성능에 미치는 영향: FIND_IN_SET()을 사용하면 특히 대규모 데이터 세트의 경우 성능 문제가 발생할 수 있습니다. 위에 언급된 대체 솔루션을 사용하면 이러한 시나리오에서 성능이 향상될 수 있습니다.
  2. 가독성 및 유지 관리: 대체 솔루션은 FIND_IN_SET()을 사용하는 것보다 더 복잡하고 읽기 어려울 수 있습니다. 선택할 때 성능과 유지 관리성 간의 균형을 신중하게 고려하세요.

위 내용은 MySQL FIND_IN_SET() 대 IN(): IN()이 쉼표로 구분된 ID와 첫 번째 일치 항목만 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.