我效率很低吗? mysqli调用循环

时间:2016-02-08 19:14:55

标签: php mysql mysqli prepared-statement inner-join

我有一个包含2个表的数据库,我在items表中有一个主键(item_id)和一个外键(color_id)。我列出的项目用颜色作为标题如下,

项目详情

// ITEM_ID

// COLOR_ID

//详细

颜色

// COLOR_ID

// color_suffix

// Color_details

我列出了这些项目 颜色后缀(RE) 项目详情 项目详情 项目细节等等......

颜色后缀(RT) 物品详情 项目详情

为此,我遍历colors表并在每次循环时进行sql调用

$query = "SELECT * FROM COLORS";
$result = mysqli_query($connection,$query);
while($data= fetch_array($result)){
    echo "<h2>{$data['color_suffix']}</h2>";
    $query2 = "SELECT ... FROM items WHERE color_id = {$data['color_id']}";
    $result2 = mysqli_query($connection,$query);
    while($item = fetch_array($result2)) {
        //List all items
    }
}

这只是一种sudo代码我只是想知道是否有更有效的方法。 我一直在阅读SQL内部联接,这是我应该使用的方法吗?

我也读过准备好的陈述,但说实话,我并不真正理解其中的语法。

我应该这样做吗?还是效率极低?请记住,将有大约30种不同的颜色,然后每个约10-50个项目,以便进行大量的SQL调用。

有人可以提供一些非常基本的sudo代码来帮助我理解我将如何实现这一目标吗?

提前谢谢你 瑞恩

2 个答案:

答案 0 :(得分:2)

使用联接。然后为您的分组添加一点逻辑。

 $query = "SELECT ... FROM COLORS, ITEMS WHERE items.color_id = colors.color_id order by colors.color_id";
 $stmnt = $db->prepare($query);
 $stmnt->bind_results($color_id, $color_suffix, ...);
 $stmnt->execute();
 $cur_col_id = '';
 while($stmnt->fetch())
 {
   if($color_id !== $cur_col_id)
   {
     echo '<h2>' . $color_suffix . '</h2>';
     $cur_col_id = $color_id;
   }
   //print the items here, no second loop.
 }

请记住......不应该只是*,它应该是您将使用的实际字段列表。订单必须与bind_results调用中的顺序相匹配。您还应该添加错误检查和处理。

答案 1 :(得分:0)

您可以通过简单的内部联接来实现:

SELECT * FROM colors, items WHERE colors.color_id = items.color_id

http://dev.mysql.com/doc/refman/5.7/en/join.html