>데이터 베이스 >MySQL 튜토리얼 >FIND_IN_SET() 대 IN(): 하나는 모든 결과를 반환하고 다른 하나는 첫 번째 결과만 반환하는 이유는 무엇입니까?

FIND_IN_SET() 대 IN(): 하나는 모든 결과를 반환하고 다른 하나는 첫 번째 결과만 반환하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-11 20:46:13936검색

FIND_IN_SET() vs. IN(): Why Does One Return All Results While the Other Only Returns the First?

FIND_IN_SET() vs IN(): 쿼리 결과의 불일치 이해

관계형 데이터베이스를 쿼리할 때 차이점을 이해해야 합니다. FIND_IN_SET()과 IN() 함수 사이. 이 문서에서는 특정 데이터베이스 시나리오에서 이들의 동작을 조사합니다.

문제:

주문과 회사라는 두 테이블을 생각해 보세요. 주문 테이블에는 쉼표로 구분된 회사 ID 목록을 보유하는 attachmentCompanyIDs 열이 포함되어 있습니다. 회사 테이블에는 실제 회사 이름이 포함되어 있습니다. FIND_IN_SET() 함수를 사용하여 주문과 관련된 회사 이름을 검색하는 쿼리를 수행하면 예상된 모든 결과가 반환됩니다. 그러나 쿼리에서 FIND_IN_SET()을 IN()으로 바꾸면 첫 번째 회사 이름만 반환됩니다.

원인:

IN() 함수는 attachmentCompanyID를 단일로 해석합니다. 정수이지만 FIND_IN_SET()은 이를 문자열로 처리합니다. attachedCompanyIDs가 정수로 캐스팅되면 숫자가 아닌 첫 번째 문자(쉼표)까지의 숫자만 유지됩니다. 결과적으로 IN() 쿼리는 쉼표로 구분된 목록의 첫 번째 숫자와 연관된 회사만 반환합니다.

해결책:

이 문제를 피하기 위해 PostgreSQL은 다음을 제공합니다. 더욱 강력한 솔루션:

SELECT name
FROM orders
JOIN company
ON companyID = ANY(('{' || attachedCompanyIDs || '}')::INT[])
WHERE orderID = 1;

이 쿼리는 ANY() 함수를 활용하여 attachmentCompanyID를 다음과 같이 캐스팅합니다. companyID에서 인덱스를 효과적으로 사용할 수 있도록 하는 배열입니다.

업데이트:

배열 지원이 부족한 MySQL 데이터베이스의 경우 대체 접근 방식을 사용할 수 있습니다.

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);

이 쿼리는 잠재적 위치를 반복하여 연결된 CompanyID에서 companyID와 일치하는 하위 문자열을 추출합니다. 여러 조인이 필요하지만 쉼표로 구분된 목록에 제한된 수의 회사 ID가 있는 시나리오에서는 계속 작동합니다.

위 내용은 FIND_IN_SET() 대 IN(): 하나는 모든 결과를 반환하고 다른 하나는 첫 번째 결과만 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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