在我的网络应用程序的主页上,我将显示有限数量的项目。我有来自2个不同表的2个查询以显示这些特定项:
这允许我选择要在主页上显示的项目。
我有2个查询:
$t1_items = DB::fetch("SELECT * FROM 'table1'");
$t2_items = DB::fetch("SELECT * FROM 'table2'");
我有2个foreach
循环遍历每个表格,并比较来自' table2'每个项目都在' 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;
}
}
}
?>
这是表结构:
table1:position_name - ref_id
表2:id - title
这段代码完美无缺,唯一的问题是它显然效率极低,因为它必须扫描数据库表中的每一项,才能只抓取几个选项。
我是否有办法让$t1_items
仅动态查询与$t2_items
中每个引用ID相同的ID相同的项?我需要一些优化,快速和轻量级的东西,以支持繁重的流量。
感谢您的帮助! :)
答案 0 :(得分:7)
您是否尝试将表格加入一个查询?
即:
select
t1.*
from table1 t1 inner join
table2 t2 on t1.id = t2.ref_id
将返回table1
中ref_id=id
行table2
的所有行。
答案 1 :(得分:0)
为什么不在第一个查询中使用子查询来仅提取table2中存在的项目?
$t1_items = DB::fetch("SELECT * FROM 'table1' as t1 WHERE EXISTS (SELECT * FROM 'table2' as t2 WHERE t1.id = t2.ref_id)");
通过这种方式,您可以在单个查询中完成所有操作,并让数据库完成工作。
答案 2 :(得分:0)
使用以下代码从table1获取所有记录,这些记录也在table2表中作为外键ref_id
$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
}
&GT;