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

Php 如何使用2个MySQL查询动态选择有限数量的项?,php,mysql,pdo,Php,Mysql,Pdo,在我的web应用程序主页上,我将显示数量有限的项目。为了显示这些特定项目,我从两个不同的表中进行了两次查询: “table1”包含我的应用程序的所有项目的列表 “table2”包含一列,该列用作“table1”中具有相同id的某些项的引用id 这允许我选择要在主页上显示的项目 我有两个问题: $t1\u items=DB::fetch(“从“表1”中选择*) $t2\u items=DB::fetch(“从“表2”中选择*) 我有2个foreach循环在每个表中运行,并将“table2”

在我的web应用程序主页上,我将显示数量有限的项目。为了显示这些特定项目,我从两个不同的表中进行了两次查询:

  • “table1”包含我的应用程序的所有项目的列表
  • “table2”包含一列,该列用作“table1”中具有相同id的某些项的引用id
这允许我选择要在主页上显示的项目

我有两个问题:

  • $t1\u items=DB::fetch(“从“表1”中选择*)
  • $t2\u items=DB::fetch(“从“表2”中选择*)
我有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\u name-ref\u id

表2:
id-标题

这段代码工作得非常好,唯一的问题是它显然非常低效,因为它必须扫描数据库表中的每一项,以便只获取几个选定项

是否有一种方法可以使
$t1\u items
仅动态查询与
$t2\u items
中的每个参考id具有相同id的项目?我需要的东西是优化,快速和轻,以支持繁重的交通


谢谢你的帮助!:)

为什么不在第一个查询中使用子查询来只拉入表2中存在的项

$t1_items = DB::fetch("SELECT * FROM 'table1' as t1 WHERE EXISTS (SELECT * FROM 'table2' as t2 WHERE t1.id = t2.ref_id)");

通过这种方式,您可以在一个查询中完成所有操作,并让数据库完成工作。

您是否尝试将表连接到一个查询中

即:


这将返回
table1
中的所有行,这些行在
table2
中的
ref\u id=id
使用以下代码从table1中获取所有记录,这些记录也作为外键ref\u id在table2表中

$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
}

您可以发布在上下文中执行查询的php代码吗?您需要从第一个查询中获取ID,并将其转换为第二个查询的查询字符串。因此,请发布表结构。您可以在列匹配的位置发布这两个表结构吗?当然,抱歉,我不知道在应用程序中处理大量数据库提升是初学者的常见错误。id的匹配应该由数据库引擎处理。我会尝试一下,然后再给你回复。谢谢:)我是新手,你能解释一下为什么“t1”和“table1”是分开的吗?还有,“t1.*”是做什么的?我不确定你的确切设置是什么,所以我不能说为什么会这样做。你可以阅读更多关于数据规范化的内容,甚至维基百科上也有关于它的文章:我试图使用你的代码,但它的语法无效。您是否缺少“”或其他内容?子查询对于高流量来说是不可能的。每个子查询生成一个临时表。这将对数据库服务器造成重大性能影响。使用连接,这样数据库就可以使用它自己的现有索引进行测试。来自我的Oracle后台的子查询总是最有效的机制,优先于连接。也许如果我们像Chris London在这里()那样将子查询放在连接中,它将是最有效的。在MySQL中,它总是在where子句中生成一个不可索引的引用。与联接相结合也可能有效。但在我看来,在这种情况下,它并没有提供额外的价值。再看一下示例中的第一行。考虑到这个问题,我几乎不认为DB是如此优化,因此子选择可能是可行的。有趣的是,在Chris London的测试中,子查询的性能比左连接好。也许内部联接(如上面的答案所示)会更有效。在这种情况下,“内部联接”和“左联接”有什么区别?即使表2中没有引用表1中的行,左联接也会返回表1中的所有行。
<?php   
foreach ($items as $i => $item) {
     // Displays the item
}