php 다중 쿼리 select 사용해서 배열에 넣는법

조회수 2175회

테이블이

barcode(barcode, food_code, company_code)
food(food_code, food_name)
company(company_code, company_name)

이렇게 있는데 처음엔 join을 써서 하려니까 시간이 너무 걸리더라구요...

그래서 select를 3번 써서 빠르게 하려는데 php에서 다중 쿼리 select 쓰는 방법 검색해서 해보는데 원하는 결과가 안 나옵니다...

첫번째 쿼리문은 바코드를 입력하면 barcode.food_code를 거쳐 food.food_name을 가져오려고 합니다.

두번째 쿼리문은 바코드만 가져옵니다.

세번째 쿼리문은 바코드를 입력하면 barcode.company_code를 거쳐 company.company_name을 가져옵니다.

최종적으로 제가 원하는 결과는 url에 바코드를 하나 입력하면 그 바코드에 맞는 정보들을 가져와 배열에 넣는겁니다. 다중 쿼리 select 어떻게 써야 배열에 들어가나요?

밑에는 제가 짰던 php문입니다.

<?php
require_once 'conn.php';

if (isset($_GET['barcode'])) {
    $barcode = $_GET['barcode'];
    $query = "select FOOD_NAME FROM food WHERE FOOD_CODE=(select FOOD_CODE FROM barcode WHERE BARCODE=(select BARCODE FROM barcode WHERE BARCODE='$barcode')); ";
    $query .= "select BARCODE FROM barcode WHERE BARCODE='$barcode'; ";
    $query .= "select COMPANY_NAME FROM company WHERE COMPANY_CODE=(select COMPANY_CODE FROM barcode WHERE BARCODE=(select BARCODE FROM barcode WHERE BARCODE='$barcode'));";
    $response = [];

    if (mysqli_multi_query($conn, $query)) {
        do {
            if ($result = mysqli_store_result($conn)) {
                while ($row = mysqli_fetch_row($result)) {
                    array_push(
                        $response, [
                            'barcode' => $row['BARCODE'],
                            'food_name' => $row['FOOD_NAME'],
                            'company_name' => $row['COMPANY_NAME']
                        ]
                    );
                }
                mysqli_free_result($result);
            }
        } while (mysqli_next_result($conn));
    }
    echo json_encode($response);
}

mysqli_close($conn);

1 답변

  • 뭐 대충 찾아보니 mysqli_multi_query()라는 게 있기는 한데 이걸 쓰시는 순간 다음과 같은 간단한 자료 조회 질의 작업이 산으로 갈 공산이 큽니다.

    SELECT b.barcode, f.food_name, c.company_name
      FROM barcode b
      JOIN food f ON f.food_code = b.food_code
      JOIN company c ON c.company_code = b.company_code
     WHERE b.barcode = '바코드값'
     GROUP BY b.barcode, f.food_name, c.company_name
    

    이 간단한 쿼리가 느리게 돈다는 부분이 오히려 문제라고 생각됩니다. 각 테이블별 PK, 테이블 간의 FK가 어떻게 되어 있나요? 그 인덱싱만 잘 돼 있으면 다음과 같은 간단한 PHP 코드로 쭉 뽑아오실 수 있습니다.

    $barcode = $_GET['barcode'];
    $query =
    "SELECT b.barcode, f.food_name, c.company_name
      FROM barcode b
      JOIN food f ON f.food_code = b.food_code
      JOIN company c ON c.company_code = b.company_code
     WHERE b.barcode = ?
     GROUP BY b.barcode, f.food_name, c.company_name";
    
    // mysqli_* 함수보다는 PDO를 쓰시는 편이 좋습니다.
    $dsn = "mysql:host=localhost;port=3306;dbname=testdb;charset=utf8";
    $db = new PDO($dsn, "testuser", "testpassword");
    
    // 쿼리문 안의 물음표 자리에 입력값(바코드값)을 바인딩해 실행합니다.
    // 지금처럼 $query 변수 안에 사용자 입력값을 주입하시면 SQL인젝션 이라는 해킹공격 을 당하실 수 있습니다.
    $stmt = $db->prepare($query);
    $stmt->execute([$barcode]);
    
    // 이게 끝입니다.
    $result = $stmt->fetchAll(PDO::FETCH_OBJ);
    var_dump($result);
    

    세 테이블의 DDL을 올려주시면 다른 고수분들이 보시고 도와주실지도 모릅니다.

    • 응답이 늦어 죄송합니다. 신입사원이라 너무 정신이 없네요. PDO라는게 있군요! 한 번 찾아봐야겠습니다. 정말 감사합니다!! 알 수 없는 사용자 2020.8.26 17:25

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)