2012-12-03 3 views
1

쿼리를 처리하는 하나의 PHP 파일에서 많은 수의 조인과 하위 쿼리가있는 쿼리가 있다고 가정 해 봅니다. Nb를 : 나는 $ 쿼리가 HTML을 처리하는 내 PHP 파일에서 다음 바닥조건부 쿼리를 사용한 쿼리

$query = query here; 
if ($query) { 
      return $query->result(); 
     } else { 
      return false; 
     } 
} 

에서 어떻게 생겼는지의 예를 넣어, 내가 예컨대 다른 쿼리을 필요로하는 일부 조건에 보통 foreach 루프를 가지고; 참고 : result house 객체 $ query-> result().

foreach ($results as $item) { 
     $some_array = array(); 
     $some_id = $item->id; 
     if ($some_id != 0) { 
      //id_return_other_id is a function that querys a db table and returns the specified column in the same table, it returns just one field 
      $other_id = id_return_other_id($some_id); 
      $some_query = another query that requires some joins and a subquery; 
      $some_array = the values that are returned from some_query in an array 
      //here i'm converting obj post into an array so i can merge the data in $some_array to item(Which was converted into an array) then convert all of it back into an object 
      $item = (object)array_merge($some_array, (array)$item); 
     } 

//do the usual dynamic html stuff here. 
} 

이 완벽하게 작동하지만 난 루프에서 많은의 쿼리를하고 있어요 방식을 좋아하지 않기 때문에, 쿼리를 처리하는 파일의 경우 $ SOME_ID! = 0을 추가하는 방법이 있나요? 내가

$query = query here; 
//declaring some array as empty when some_id is 0 
$some_array = array(); 
if ($query) { 
      if ($some_id != 0) { 
      //same as i said before 
      $other_id = $this->id_return_other_id($some_id); 
      $some_query = some query; 
      $some_array = array values gotten from some query; 

     } 
      $qresult = (object)array_merge($some_array, (array)$query->result); 
      return $qresult; 
     } else { 
      return false; 
     } 
} 

이것은 분명한 이유가 작동하지 않습니다 시도했습니다, 하나는 어떤 아이디어가 있습니까?

또한 $ 쿼리 자체에서 이러한 조건과 쿼리를 만드는 방법이 있다면 나는 당신을 영원히 사랑할 것입니다.

시 : 데모 쿼리는

$sql = "SELECT p.*,up.*,upi.someField,etc.. 
        FROM (
          SELECT (another subquery) 
          FROM table1 
          WHERE table1_id = 3 
          UNION ALL 
          SELECT $user_id 
          ) uf 
        JOIN table2 p 
        ON  p.id = uf.user_id 
        LEFT JOIN table3 up 
        ON  ..... 
        LEFT JOIN table4 
        ON  .... 
        LEFT JOIN table5 
        ON  .... 
        And so on..etc.. 
        ORDER BY p.date DESC"; 
$query = mysql_query.. 
+2

[** 새 코드 **에서 mysql_ * 함수를 사용하지 마십시오 (http://bit.ly/phpmsql). 그들은 더 이상 유지 관리되지 않으며 [비추천 프로세스] (http://j.mp/Rj2iVR)가 시작되었습니다. [** 빨간색 상자 **] (http://j.mp/Te9zIL)를 참조하십시오. 대신 [* prepared statements *] (http://j.mp/T9hLWi)에 대해 알아보고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용하십시오. mysqli) - [이 기사] (http://j.mp/QEx8IB)는 어떤 결정을 내리는 데 도움이 될 것입니다. PDO를 선택하면 [여기는 좋은 튜토리얼입니다] (http://j.mp/PoWehJ). – Neal

+0

감사합니다 닐, 내가 실제로 mysql_ persay를 사용하지 않았고, 나는 적극적인 레코드를 사용하고 있습니다. 그저 내가 의미하는 바를 설명하기 위해 거기에 넣었습니다. 내가 갖고있는 문제에 대해 어떻게 생각하는지 알고 있습니까? – Saff

답변

2

if ($some_id !== 0) { 

같은 것 당신의 쿼리 파일. 첫 번째 쿼리는 원하는 것을 광범위하게 가져옵니다. 두 번째 쿼리는 결과에있는 ID를 쿼리하고 새 쿼리를 수행하여 해당 ID에 대한 세부 정보를 가져옵니다. 내 응용 프로그램의 고객 검색 페이지에서 이와 비슷한 것을 사용합니다. 난 당신이 객체를 사용하고 알고

foreach($queryresult as $key=> $field) 
{ 
    echo $field['some_field']; 

    foreach($child['data_details'] as $subkey => $subfield) 
    { 
     echo $subfield['some_subfield']; 
    } 
} 

,하지만 당신은 아마 형식을 사용하려면이 옵션을 변환 할 수 있습니다 :

$output = array(); 

$query1 = $this->db->query("SELECT * FROM...WHERE id = ..."); 

foreach ($query->result_array() as $row1) 
{ 
    $output[$row1['some_id']] = $row1; 

    $query2 = $this->db->query("SELECT * FROM table WHERE id = {$row1['some_id']}"); 

    foreach ($query2->result_array() as $row2) 
    { 
     $output[$row1['some_id']]['data_details'][$row2['id']] = $row2; 
    } 
} 

그런 다음 HTML을 표시 페이지에서, 당신은 단지 두 foreaches 필요합니다. 나는 이것이 의미 있고 도움이되기를 바랍니다.

+0

고맙습니다. 루프 내에 루프가 없어도 쿼리 속도가 느려 집니까? – Saff

0

사용 당신은 단지 두 개의 쿼리를 실행해야 할 것 같다 대신

if ($some_id != 0) { 
+0

아니, 문제가 아니야. 고마워요. :) – Saff