如何使用2个MySQL查询动态选择有限数量的项目?

时间:2015-03-18 11:28:52

标签: php mysql pdo

在我的网络应用程序的主页上,我将显示有限数量的项目。我有来自2个不同表的2个查询以显示这些特定项:

  • '表1'包含我的应用程序的所有项目列表
  • '表2'包含一个列,该列用作来自' table1'
  • 的具有相同ID的特定项目的引用ID

这允许我选择要在主页上显示的项目。

我有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相同的项?我需要一些优化,快速和轻量级的东西,以支持繁重的流量。

感谢您的帮助! :)

3 个答案:

答案 0 :(得分:7)

您是否尝试将表格加入一个查询?

即:

select 
    t1.* 
from table1 t1 inner join 
     table2 t2 on t1.id = t2.ref_id

将返回table1ref_id=idtable2的所有行。

答案 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;