从另一个表中获取相关数据

时间:2015-05-11 18:44:26

标签: php mysql

我有2个MySQL表,如下所示:

类:

+---------------+--------------------+
|  id           |   category_name    |
+---------------+--------------------+
|  1            |   Category 1       |
|  2            |   Category 2       |
+---------------+--------------------+

任务:

+---------------+---------------------------+-----------------+
|  id           |   task_name               |   category_id   |
+---------------+---------------------------+-----------------+
|  1            |   First task of the day   |       1         |
|  2            |   Then do this            |       1         |
+---------------+---------------------------+-----------------+

这是我的数据库的简化版本,但您明白了。

我希望按照以下任务显示类别作为标题,例如:

Category 1
   - First task of the day
   - Then do this

Category 2
   no tasks here :)

我倾向于做这样的事情......

$query = $this->db->query("SELECT * FROM categories");

foreach($query->result() as $cat){

    echo '<h1>'. $cat->category_name . '</h1>';

    $tasks_query = $this->db->query("SELECT * FROM tasks WHERE category_id='{$cat->id}'");

    foreach($tasks_query->result() as $task){
        echo $task->task_name;
    }
}

我知道这会起作用,但似乎所有这些查询都会占用大量资源。所以,我想知道这是否是正确的做法,或者是否有更好,更有效的方式。这样做的最佳做法是什么?

希望这一切都有意义。

3 个答案:

答案 0 :(得分:1)

每个查询都有一些开销是完全正确的。将SQL文本发送到数据库服务器的操作,服务器解析语句的语法,然后是语义,开发执行计划,然后实际运行语句(获取锁,访问块,释放锁),准备结果集到发回给客户。在客户端,检查状态,并检索结果。

就数据库而言,运行单个语句以返回单个结果集通常更有效。 (有些情况下它不是,例如当大型查询效率低下时,例如结果集真的非常大,并且需要昂贵的排序操作。)

如何在一个语句中获得结果的示例:

SELECT c.category_name
     , t.task_name
  FROM categories c
  LEFT
  JOIN tasks t 
    ON t.category_id = c.id
 ORDER 
    BY c.category_name
     , t.task_name

另一方面是有一些&#34;额外的&#34;需要在客户端进行处理的工作。

initialize a variable to hold "previous" category_name
loop fetching rows (until no more rows)
  if category_name is not equal to previous category_name
     emit category e.g. output "<h1>category_name"
     save new category_name as previous
  end if
  if task_name is not null
     emit task e.g. output "<br>task_name"
  end if
end loop

答案 1 :(得分:1)

如果在SQL查询中使用join,它会给数据库带来更多的负担,而不是PHP引擎(它会更快,资源更少,因为你&#39;重新运行一个查询而不是循环中的许多查询。)

$query = $this->db->query(
                'SELECT *
                FROM tasks t
                    INNER JOIN categories c
                        ON t.category_id = c.id');

foreach ( $query->result() as $result) {
    echo $result->category_name . ' ' . $result->task_name;
}

答案 2 :(得分:0)

感谢大家的回答和帮助。我更多地关注MySQL连接,这就是我想出来的并且它有效!...

    $query = $this->db->query("
        SELECT c.category_name, t.task_name
        FROM categories c
        INNER JOIN tasks t
        ON c.id = t.category_id");

    $categories = array();

    foreach($query->result() as $result)
    {

        if ( !in_array($result->category_name, $categories) )
        {
            $categories[] = $result->category_name;
            echo '<h3>' . $result->category_name . '</h3>';
        }

        echo "<div>" . $result->task_name . "</div>";
    }