2012-12-03 70 views
1

假设我在一个处理查询的php文件中有相当数量的连接和子查询。 注:我把什么$查询看上去像底部有条件查询的查询

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

然后在我的PHP文件,处理HTML的例子,我有需要作出其他查询e.g一些条件一般的foreach循环; 注意:结果包含对象$ 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; 
     } 
} 

这并不明显的原因工作,没有任何一个有什么想法?

此外,如果有一种方法可以在$查询本身中生成这些条件和查询,我会永远爱你。

PS:一个演示查询会是这样的

$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)?学习[*准备的语句*](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

谢谢Neal,我实际上没有使用mysql_ persay,我使用的是活动记录,我只是把它放在那里来解释我的意思:)你有什么想法我可以去解决我遇到的问题吗? – Saff

回答

2

好像你只需要在运行两个查询您的查询文件。第一个查询将得到一个广泛的你正在寻找什么。第二个查询将查询结果中的一个id,并执行一个新查询以获取有关该特定id的任何详细信息。我在我的应用程序的客户搜索页面中使用类似于此的内容。

$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:

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

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

我知道你正在使用的对象,但你也许可以将它转换为使用该格式。我希望这是有道理的/有帮助的。

+0

谢谢你,它的工作!循环中没有循环会减慢查询速度? – Saff

0

使用本

if ($some_id !== 0) { 

代替

if ($some_id != 0) { 
+0

不,这不是问题。谢谢寿:) – Saff