我有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;
}
}
我知道这会起作用,但似乎所有这些查询都会占用大量资源。所以,我想知道这是否是正确的做法,或者是否有更好,更有效的方式。这样做的最佳做法是什么?
希望这一切都有意义。
答案 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>";
}