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

その通りです。多くの場合、複数のクエリを実行するよりも、1 つのクエリを実行する方がはるかに効率的です。データベースでの処理が速くなり (ラウンド トリップが少なくなります)、コードがより使いやすくなります。

から行を取得する 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 によって返される行は任意です。つまり、後続の実行から返される結果は、前の実行と同じであるとは限りません。 .)

上記のクエリは、から返される行数mを取得するために、としてエイリアス化されたインライン ビュー (MySQL では派生テーブルと呼ばれます) を使用します。その LIMIT が必要ない場合は、そのインライン ビューを削除することでクエリを簡素化できます。LIMIT 1membres

INNERキーワードはオプションであり、オプティマイザには影響しません。つまり、INNER JOINと同義JOINです。

于 2013-06-04T22:48:36.510 に答える