在我的Web应用程序的主页上,我将显示有限数量的项目。我有来自 2 个不同表的 2 个查询,以显示这些特定项目:
- "table1"包含我的应用程序的所有项目的列表 ">
- table2"包含一个列,该列用作与"table1"具有相同ID的某些项目的引用ID 。
这允许我选择要在主页上显示的项目。
我有2个疑问:
-
$t1_items = DB::fetch("SELECT * FROM 'table1'");
-
$t2_items = DB::fetch("SELECT * FROM 'table2'");
我有 2 个贯穿每个表的 foreach
循环,并将"table2"中的 id 与"table1"中的每个项目进行比较。如果两个表中的 ID 匹配,则会在主页上显示该项目。
这允许我通过更改"table2"中每个项目的引用 ID 来选择要在主页上显示的项目。
这是我的foreach
循环代码:
<?php
foreach ($t1_items as $i => $t1_item) {
foreach ($t2_items as $i => $t2_item) {
if ($t1_item->id == $t2_item->ref_id) {
echo $t1_item->title;
}
}
}
?>
下面是表结构:
表1:position_name - ref_id
表 2:id - title
这段代码工作得很好,唯一的问题是它显然效率极低,因为它必须扫描数据库表中的每个项目才能只抓取几个选定的项目。
有没有办法让我$t1_items
仅动态查询与$t2_items
中的每个引用 id 具有相同 id 的项目?我需要经过优化、快速和轻量级的东西来支持繁忙的交通。
感谢您的帮助! :)
您是否尝试过将表合并到一个查询中?
即:
select
t1.*
from table1 t1 inner join
table2 t2 on t1.id = t2.ref_id
这将返回table1
中具有ref_id=id
行的所有行 table2
.
为什么不在第一个查询中使用子查询来仅拉取 table2 中存在的项目?
$t1_items = DB::fetch("SELECT * FROM 'table1' as t1 WHERE EXISTS (SELECT * FROM 'table2' as t2 WHERE t1.id = t2.ref_id)");
这样,您可以在单个查询中完成所有操作,并让数据库完成工作。
使用以下
代码从表1中获取所有记录,这些记录也作为外键ref_id在表2
表中$items = DB::fetch("SELECT * FROM `table1` t1 LEFT JOIN `table2` t2 ON `t2`.ref_id = `t2`.id");
现在,使用以下循环遍历所有记录
<?php
foreach ($items as $i => $item) {
// Displays the item
}
?>