집 >데이터 베이스 >MySQL 튜토리얼 >FIND_IN_SET() 및 IN(): 다중 테이블 쿼리에 각 함수를 언제 사용해야 합니까?
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 열을 처리하는 방식에 있습니다.
잠재적인 문제 IN()
데이터베이스 예제에서 attachmentCompanyIDs는 문자열로 저장됩니다. IN() 함수에서 사용되면 자동으로 정수로 변환됩니다. 그러나 이 캐스팅에서는 쉼표 앞의 첫 번째 숫자만 고려합니다. 따라서 첨부된CompanyIDs 목록의 첫 번째 회사 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!