>데이터 베이스 >MySQL 튜토리얼 >FIND_IN_SET() 및 IN(): 다중 테이블 쿼리에 각 함수를 언제 사용해야 합니까?

FIND_IN_SET() 및 IN(): 다중 테이블 쿼리에 각 함수를 언제 사용해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-11 08:02:13410검색

FIND_IN_SET() vs. IN(): When Should I Use Each Function for Multi-Table Queries?

FIND_IN_SET() 대 IN(): 쿼리 차이점 이해

여러 테이블에서 데이터를 쿼리할 때 구문을 이해하는 것이 중요합니다. 사용은 결과에 영향을 미칩니다. 다음 상황을 고려해보세요.

두 개의 테이블이 있는데 하나는 주문용이고 다른 하나는 회사용입니다. 주문 테이블에는 쉼표로 구분된 회사 ID가 있는attachedCompanyIDs 열이 포함되어 있고 회사 테이블에는 CompanyID 및 이름 열이 포함되어 있습니다.

FIND_IN_SET()을 사용하여 쿼리

아래 쿼리 특정 주문과 관련된 모든 회사 이름을 검색할 수 있습니다.

SELECT name FROM orders, company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)

이 쿼리는 성공적으로 반환됩니다. 모든 회사 이름: Company 1, Another Company 및 StackOverflow.

IN()으로 쿼리

그러나 FIND_IN_SET()을 다음으로 바꾸어 쿼리를 약간 수정하면 IN(), 결과 변경:

SELECT name FROM orders, company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)

이 경우 쿼리는 IN()에 나열된 첫 번째 회사 이름만 반환합니다. attachmentCompanyIDs 열: 회사 1.

차이 이해

이러한 차이의 이유는 이 두 함수가 attachmentCompanyIDs 열을 처리하는 방식에 있습니다.

  • FIND_IN_SET(): 이 함수는 다음을 고려합니다. attachmentCompanyIDs의 전체 문자열을 검색하고 그 안에 companyID가 있는지 확인합니다.
  • IN(): 이 함수는 attachmentCompanyID를 스칼라 값(예: 단일 숫자)으로 해석하고 해당 여부를 확인합니다. 제공된 회사 ID와 일치합니다.

잠재적인 문제 IN()

데이터베이스 예제에서 attachmentCompanyIDs는 문자열로 저장됩니다. IN() 함수에서 사용되면 자동으로 정수로 변환됩니다. 그러나 이 캐스팅에서는 쉼표 앞의 첫 번째 숫자만 고려합니다. 따라서 첨부된CompanyIDs 목록의 첫 번째 회사 ID만 고려됩니다.

가능한 해결 방법

  • 직접 테이블 조인 사용: 조인 companyID 열의 주문 및 회사 테이블을 사용하여 회사 이름을 검색합니다. 이 접근 방식은 정확한 결과를 보장하지만 각 주문과 연결된 회사 ID가 많을 경우 성능에 영향을 미칠 수 있습니다.
  • 고급 쿼리 사용: AttachedCompanyIDs 열에는 다음과 같이 더 복잡한 쿼리를 사용할 수 있습니다.

    SELECT name
    FROM orders
    CROSS JOIN (
      SELECT 1 AS pos
      UNION ALL
      SELECT 2 AS pos
      UNION ALL
      SELECT 3 AS pos
      UNION ALL
      SELECT 4 AS pos
      UNION ALL
      SELECT 5 AS pos
    ) q
    JOIN company
    ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)

이 쿼리 SUBSTRING_INDEX() 함수를 사용하여 attachmentCompanyIDs 문자열에서 개별 회사 ID를 추출합니다.

위 내용은 FIND_IN_SET() 및 IN(): 다중 테이블 쿼리에 각 함수를 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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