php - 如何在不依赖 PHP 循环的情况下执行此查询?

标签 php mysql loops for-loop inner-join

我是 MySQL 的新手。看来我需要在 MySQL 请求中执行某种循环,但我认为使用一些“INNER JOIN”内容可能会更有效。

这是我的 PHP 代码:

$query = 'SELECT id FROM membres WHERE pseudo = :pseudo LIMIT 1';
$req = $dtb -> prepare($query);
$req -> execute(array(
    'pseudo' => $_COOKIE['pseudo']
));
while($donnes = $req -> fetch()){
    $id_pseudo = $donnes['id'];
}
$req -> closeCursor();
$query = 'SELECT id_chanson FROM samples WHERE id_membre = :id_pseudo';
$req = $dtb -> prepare($query);
$req -> execute(array(
    'id_pseudo' => $id_pseudo
));
$id_chansons = array();
while($donnes = $req -> fetch()){
    $id_chansons[] = $donnes['id_chanson'];
}
$req->closeCursor();
$nSongs= count($id_chansons);
$query = 'SELECT nom, pathName, date FROM chansons WHERE id = :id_chanson';
$req = $dtb -> prepare($query);
for($i=0;$i<$nSongs;$i++){
    $req -> execute(array(
        'id_chanson' => $id_chansons[$i]
    ));
    while($donnes = $req -> fetch()){
        $nomChanson[$i] = $donnes['nom'];
        $pathName[$i] = $donnes['pathName'];
        $date[$i] = $donnes['date'];
    }
}

编辑:我的表名称是“chansons”(法语歌曲)“membres”(用户)和“samples”

:)

最佳答案

您是对的,运行单个查询通常比运行多个查询更有效。它在数据库上的速度更快(往返次数更少),并且代码更加友好。

下面是一个示例 SQL 查询,它将从 chansons 检索行:

    SELECT c.nom
         , c.pathName
         , c.date
      FROM (SELECT id FROM membres WHERE pseudo = :pseudo ORDER BY id LIMIT 1) m
      JOIN samples s 
        ON s.id_membre = m.id
      JOIN chansons c
        ON c.id = s.id_chanson
     ORDER BY 1

注释:

如果您需要结果集中返回的其他表的 id 值,这些表达式也可以包含在 SELECT 列表中。 (从您的代码中,我没有看到这些 id 值用于后续查询以外的任何用途......但这当然并不意味着它们没有在其他地方引用。

我在内联 View 中的查询中添加了 ORDER BY,以使其具有确定性。如果满足查询的行数多,如果没有 ORDER BY 子句,MySQL 返回哪一行是任意的,即不保证后续执行返回的结果与上一次运行的结果相同.)

上面的查询使用别名为 m 的内联 View (MySQL 称之为派生表),来获取从返回的行数的 LIMIT 1 成员。如果您不需要该 LIMIT,则可以通过删除该内联 View 来简化查询。

INNER 关键字是可选的,它对优化器没有影响。也就是说,INNER JOINJOIN 同义。

关于php - 如何在不依赖 PHP 循环的情况下执行此查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16928659/

相关文章:

php - SSL 连接错误 :140770FC

php - 方法参数缩进的 Netbeans 自动格式问题

php - MySQL ROLLBACK 并与 PHP 一起使用

MySQL 查询返回语法错误

php - 使用php获取字符串的一部分

php - 使用内爆从数组输出编号列表?

MySQL - 在相关子查询中限制聚合数据时嵌套子查询的替代方法

javascript - Ajax 调用循环,Ajax jQuery

c - 循环中的变量定义

Scala 向下还是 for 循环递减?