본문 바로가기
IT tech Coding/php

PHP에서 효율적인 검색 쿼리 작성법: 특정 아이템과 스펙 검색하기

by Coding Life 2025. 1. 21.

PHP와 MySQL을 활용해 데이터를 검색할 때, 효율적으로 작성된 SQL 쿼리는 성능을 크게 좌우합니다. 특히 다양한 조건에서 데이터를 검색하고, 중복된 데이터를 제거하는 작업이 필요할 경우, 잘 설계된 쿼리와 준비된(Prepared) 문장은 중요한 역할을 합니다. 이번 포스팅에서는 PHP와 PDO를 사용해 특정 steel_item과 spec을 검색하는 예제를 알아봅니다. 이 코드는 세 개의 데이터 테이블을 참조하

며, 검색 조건에 따라 동적으로 동작하도록 설계되었습니다.

 

코드 설명

아래의 코드는 두 가지 주요 조건에서 동작합니다.

  1. 사용자가 특정 steel_item과 search 값을 입력한 경우.
  2. search 값 없이 steel_item만 입력한 경우.

이 두 가지 경우에 따라 쿼리를 분리해 처리하고 있습니다.

1. search 값이 입력된 경우

사용자가 특정 검색어를 입력하면, 검색어를 포함하는 데이터를 가져오도록 설계되었습니다. 세 개의 테이블(eworks, steelmake, steel)에서 데이터를 검색하고, 각 테이블의 steel_item과 spec 필드를 통합합니다.

if (!empty($search)) {
    $stmt_unique = $pdo->prepare("  
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM eworks
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item
          AND spec LIKE :search
        UNION
        SELECT DISTINCT TRIM(proditem) AS steel_item, TRIM(prodspec) AS spec
        FROM steelmake
        WHERE is_deleted IS NULL
          AND TRIM(proditem) = :steel_item2
          AND prodspec LIKE :search2
        UNION
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM steel
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item3
          AND spec LIKE :search3
    ");

    $stmt_unique->execute([
        ':steel_item' => trim($steel_item),
        ':search' => "%$search%",
        ':steel_item2' => trim($steel_item),
        ':search2' => "%$search%",
        ':steel_item3' => trim($steel_item),
        ':search3' => "%$search%"
    ]);
}

주요 포인트:

  • TRIM() 함수: 데이터를 검색할 때 불필요한 공백을 제거하여 정확한 검색을 보장합니다.
  • LIKE 연산자: %$search%로 감싸 검색어를 포함하는 데이터를 찾습니다.
  • UNION: 세 테이블에서 반환된 결과를 통합하고 중복된 항목을 제거합니다.

2. search 값이 입력되지 않은 경우

search 값 없이 특정 steel_item만으로 데이터를 검색해야 할 경우에는 아래 코드가 실행됩니다. 이는 모든 spec 데이터를 반환하며, search 조건을 제거한 간단한 구조로 작성되었습니다.

else {
    $stmt_unique = $pdo->prepare("  
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM eworks
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item
        UNION
        SELECT DISTINCT TRIM(proditem) AS steel_item, TRIM(prodspec) AS spec
        FROM steelmake
        WHERE is_deleted IS NULL
          AND TRIM(proditem) = :steel_item2
        UNION
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM steel
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item3
    ");

    $stmt_unique->execute([
        ':steel_item' => trim($steel_item),
        ':steel_item2' => trim($steel_item),
        ':steel_item3' => trim($steel_item)
    ]);
}

주요 포인트:

  • 동일한 steel_item 조건: 세 테이블에서 동일한 steel_item에 해당하는 데이터를 모두 가져옵니다.
  • 단순화된 조건: 검색어를 추가하지 않아 조건문이 단순합니다.

코드 실행 흐름

  1. search 값이 있는지 확인:
    • !empty($search) 조건을 사용하여 검색어가 비어 있는지 체크합니다.
  2. SQL 쿼리 작성:
    • 조건에 따라 WHERE 문에 LIKE 절을 추가하거나 생략합니다.
  3. Prepared Statement 실행:
    • execute() 메서드에 파라미터를 배열로 전달하여 안전한 쿼리 실행을 보장합니다.

활용 시나리오

이 코드는 다음과 같은 경우에 적합합니다:

  • 재고 관리 시스템: 철강 제품의 종류와 사양을 빠르게 검색해야 할 때.
  • 상품 검색 기능: 사용자 입력에 따라 특정 제품을 필터링해야 할 때.
  • 중복 데이터 제거: 여러 테이블에서 데이터를 조회하며 중복 항목을 통합해야 할 때.

성능 최적화 팁

  1. 인덱스 활용: steel_item과 spec 컬럼에 인덱스를 설정하면 검색 속도가 향상됩니다.
  2. 필요 없는 데이터 필터링: is_deleted IS NULL 조건을 통해 삭제된 데이터를 배제합니다.
  3. Prepared Statement: SQL 인젝션 공격을 방지하고 쿼리 실행 속도를 높이는 데 도움을 줍니다.

결론

PHP와 PDO를 활용한 검색 쿼리 작성법은 효율적인 데이터 관리를 가능하게 합니다. 이 코드 구조는 다양한 시나리오에서 활용할 수 있으며, 중복 제거와 조건별 검색이 필요한 상황에 특히 유용합니다. 적절한 데이터 정리와 조건 설정을 통해 시스템의 성능과 안정성을 함께 향상시킬 수 있습니다.

반응형