将嵌套的Mysqli查询更改为JOIN语句

时间:2014-10-20 17:39:09

标签: php mysql sql join

我们更新了下面的遗留PHP,并且我想将嵌套循环转换为JOIN查询,而不是由于嵌套查询没有输出内容的问题。

为每个类别输出<optgroup>元素(在数据库中由parentCategory_id=0描述),并为每个类别添加嵌套<option>标记非常重要。请参阅下面所需的HTML输出。

任何建议都将不胜感激。非常感谢!

PHP

<select name="category">
  <option value="">All categories</option>

  <?php
    // Get category groups
    $q = $db->query("SELECT * FROM categories WHERE parentCategory_id=0 ORDER BY category_id");
    while ($parent = $q->fetch_assoc()) {
    ?>

      <optgroup label='<?=$parent["cat_name"];?>'>

        <?php
        // Find all child categories
        $catQ = $db->query("SELECT * FROM categories WHERE parentCategory_id=$parent[category_id]");
        while ($category = $catQ->fetch_assoc($catQ)) {
        ?>

          <option value='<?=$category["category_id"];?>' $selected><?=$category["cat_name"];?></option>

        <?php } ?>

      </optgroup>

    <?php }
      $q->close();
    ?>
</select>

HTML

<select name="category">
  <option value="">All categories</option>

  <optgroup label="Clothing">
    <option value="1">Mens</option>
    <option value="2">Womens</option>
  </optgroup>

  <optgroup label="Jewellery">
    <option value="3">Gold</option>
    <option value="4">Silver</option>
  </optgroup>

</select>

1 个答案:

答案 0 :(得分:1)

我知道它是遗留代码,但这里的问题是逻辑

只要查看自己的查询。

SELECT * FROM categories WHERE parentCategory_id=0 ORDER BY category_id
SELECT * FROM categories WHERE parentCategory_id=$parent[category_id]

它是同一个表,为什么查询同一个表?

您期望如何加入?在它自己?


JOIN至少包含2个表,您需要做的是在PHP中重构数据:

$categories = array();
while ($cat = $q->fetch_assoc()){
    $categories[$cat['cat_name']][$cat['category_id']] = $cat['cat_type'];
}

然后构建你的选择:

<select name="category">
  <option value="">All categories</option>
<?php foreach($categories as $label => $opt): ?>
    <optgroup label="<?php echo $label; ?>">
    <?php foreach ($opt as $id => $name): ?>
        <option value="<?php echo $id; ?>"><?php echo $name; ?></option>
    <?php endforeach; ?>
    </optgroup>
<?php endforeach; ?>
</select>