2016-05-12 83 views
1

我在查询php中的一个大数据库,并且我没有做的很好。 我有我需要的代码,我简单地找不到一个很好的方法来压缩这些语句。PHP/SQL,减少查询次数

$q = $_GET['q']; 
    (dbinit) 
    $query = "SELECT post_id FROM wp_postmeta WHERE meta_key = '_billing_email' AND meta_value = '$q'"; 
    $result = mysql_query($query); 

    while ($row = mysql_fetch_array($result)) 
{ 
$thing = $row['post_id']; 
$querys = "SELECT 'meta_value' FROM wp_postmeta WHERE post_id = '$thing' AND meta_key = '_order_number'"; 
$results = mysql_query($querys); 
$rows = mysql_fetch_array($results); 
$postid = $rows['meta_value']; 
$queryss = "SELECT post_id FROM $table WHERE meta_value = $postid AND meta_key = '_order_number'"; 
$resultss = mysql_query($query); 
$rowss = mysql_fetch_array($result); 
$order_id = $rowss['post_id']; 
(handling) 
} 

我想知道是否有更有效的方式来做这些查询,或者可能让他们在一个查询中?

+4

使用连接,更新您的驱动程序,使用参数化查询。 – chris85

+0

@ chris85如此之多的话语中的如此之大 - 如果可以的话,我会再次高举。 – JimL

+0

**警告**:通过将'$ _GET'数据直接放入您的查询中,您已经创建了一个危险的[SQL注入漏洞](http://bobby-tables.com/)。 **从不**这样做。相反,使用WordPress [准备语句功能](http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks)来正确地转义所有数据参数。 – tadman

回答

0

不确定在哪里$table来自。

但这JOIN尝试应该工作:

$q = $_GET['q']; 
// ... dbinit ... 

$query = "SELECT wpp.post_id, 
     wpp1.meta_value as orderNumber, 
     wpp2.post_id as orderId 

    FROM wp_postmeta wpp 
    LEFT JOIN wp_postmeta wpp1 
    ON wpp1.post_id = wpp.post_id 
     AND wpp1.meta_key = '_order_number' 
    LEFT JOIN $table wpp2 
    ON wpp2.meta_value = wpp1.meta_value 
     AND wpp2.meta_key = '_order_number' 
    WHERE wpp.meta_key = '_billing_email' 
     AND meta_value = '$q'"; 

$result = mysql_query($query); 
while ($row = mysql_fetch_array($result)) { 
    (handling) 
} 

正如你可以看到,如果需要,你可以得到

$thing = $row['post_id']; 
$order_id = $row['orderId']; 

内循环。

+0

先生,你现在是我的神。 – Bc1151

+0

@ Bc1151不要忘记关闭SQL注入。 – chris85