0

我是 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”

:)

4

2 回答 2

0
select m.id, s.id_chanson, ch.nom, ch.pathName, ch.date
  from membres m
       inner join samples s on m.id = s.id_membre
       inner join chansons ch on s.id_chanson = ch.id
 where pseudo = :pseudo
于 2013-06-04T22:42:42.703 回答
0

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

这是一个示例 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 值被用于后续查询之外的任何内容......但这当然并不意味着它们没有在其他地方被引用。

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

上面的查询使用别名为 的内联视图(MySQL 将其称为派生表)m来获取LIMIT 1membres. 如果您不需要该 LIMIT,则可以通过删除该内联视图来简化查询。

关键字是可选的INNER,它对优化器没有影响。即 是INNER JOIN的同义词JOIN

于 2013-06-04T22:48:36.510 回答