>데이터 베이스 >MySQL 튜토리얼 >조인된 테이블에서 LIMIT 1을 사용하여 테이블을 효율적으로 조인하는 방법은 무엇입니까?

조인된 테이블에서 LIMIT 1을 사용하여 테이블을 효율적으로 조인하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-15 21:05:02671검색

How to Efficiently Join Tables with LIMIT 1 on a Joined Table?

조인된 테이블에서 LIMIT 1을 사용하여 테이블을 효율적으로 조인

문제:

한 테이블만 검색하면서 두 테이블을 조인하려면 특히 조인된 테이블에 여러 레코드가 존재하는 상황에서 기본 테이블의 각 레코드에 대해 조인된 테이블의 레코드를 삭제합니다.

하위 쿼리를 사용한 솔루션:

이 접근 방식 결과를 단일 레코드로 제한하면서 조인된 테이블에서 여러 열을 선택할 때 발생하는 오류를 효과적으로 방지합니다. 핵심은 하위 쿼리를 활용하여 원하는 레코드의 기본 키를 검색하는 것입니다. 그런 다음 하위 쿼리를 사용하여 기본 쿼리에서 조인된 테이블을 필터링합니다.

SELECT
c.id,
c.title,
p.id AS product_id,
p.title AS product_title
FROM categories AS c
JOIN products AS p ON
p.id = (                                 --- the PRIMARY KEY
SELECT p1.id FROM products AS p1
WHERE c.id=p1.category_id
ORDER BY p1.id LIMIT 1
)

이 쿼리는 조인된 테이블에 기본 테이블보다 훨씬 많은 수의 레코드가 포함되어 있는 경우에도 뛰어난 성능을 보여줍니다.

대체 접근 방식:

하위 쿼리 접근 방식이 일반적으로 최적이지만 사용할 수 있는 대체 방법이 있습니다. 그러나 잠재적인 성능 영향을 고려하는 것이 중요합니다.

  • GROUP BY 및 Array Aggregation 사용(LIMIT 적용 불가):
SELECT
  id,
  category_title,
  (array_agg(product_title))[1]  
FROM
    (SELECT c.id, c.title AS category_title, p.id AS product_id, p.title AS product_title
    FROM categories AS c
    JOIN products AS p ON c.id = p.category_id
    ORDER BY c.id ASC) AS a 
GROUP BY id, category_title;
  • CROSS JOIN 및 ROW_NUMBER 사용(LIMIT 적용 불가):
SELECT
  c.id,
  c.title,
  p.id AS product_id,
  p.title AS product_title
FROM categories AS c
CROSS JOIN (SELECT product_id, title, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id) AS rn
            FROM products) AS p
WHERE rn = 1;

위 내용은 조인된 테이블에서 LIMIT 1을 사용하여 테이블을 효율적으로 조인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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