Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不依赖PHP循环的情况下执行此查询?_Php_Mysql_Loops_For Loop_Inner Join - Fatal编程技术网

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

如何在不依赖PHP循环的情况下执行此查询?,php,mysql,loops,for-loop,inner-join,Php,Mysql,Loops,For Loop,Inner Join,我是MySQL的新用户。看起来我需要在MySQL请求中执行某种循环,但我认为使用一些“内部连接”的东西可能会更有效 以下是我的PHP代码: $query = 'SELECT id FROM membres WHERE pseudo = :pseudo LIMIT 1'; $req = $dtb -> prepare($query); $req -> execute(array( 'pseudo' => $_COOKIE['pseudo'] )); while($donn

我是MySQL的新用户。看起来我需要在MySQL请求中执行某种循环,但我认为使用一些“内部连接”的东西可能会更有效

以下是我的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'];
    }
}
$query='从membres中选择id,其中pseudo=:pseudo LIMIT 1';
$req=$dtb->prepare($query);
$req->执行(数组)(
'pseudo'=>$\u COOKIE['pseudo']
));
而($donnes=$req->fetch()){
$id_pseudo=$donnes['id'];
}
$req->closeCursor();
$query='从样本中选择id\u chanson,其中id\u membre=:id\u pseudo';
$req=$dtb->prepare($query);
$req->执行(数组)(
'id\u pseudo'=>$id\u pseudo
));
$id_chansons=array();
而($donnes=$req->fetch()){
$id_chanson[]=$donnes['id_chanson'];
}
$req->closeCursor();
$nsogs=计数($id\u chanson);
$query='选择名称、路径名、来自chanson的日期,其中id=:idu chanson';
$req=$dtb->prepare($query);
对于($i=0;$i执行(数组(
'id_chanson'=>id_chanson[$i]
));
而($donnes=$req->fetch()){
$nomChanson[$i]=$donnes['nom'];
$pathName[$i]=$donnes['pathName'];
$date[$i]=$donnes['date'];
}
}
编辑:我的表名是“Chanson”(法语歌曲)“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值,也可以在选择列表中包含这些表的表达式。(从您的代码中,我看不到这些id值被用于后续查询之外的任何其他用途……但当然,这并不意味着它们没有在其他地方引用

我在内联视图中向查询添加了ORDER BY,以使其具有确定性。如果有多行满足查询,并且没有ORDER BY子句,则MySQL将返回哪一行是任意的,也就是说,后续执行返回的结果不保证与前一次运行的结果相同。)

上面的查询使用别名为
m
的内联视图(MySQL称之为派生表),以获取从
membres
返回的行数的
限制1
。如果不需要该限制,那么可以通过删除该内联视图来简化查询


internal
关键字是可选的,它对优化器没有影响。也就是说,
内部连接
连接
同义

欢迎使用堆栈溢出。谢谢你格式化你的代码。如果您讨论您想要执行的SQL查询和表结构,这将有所帮助。你在PHP中循环而不是在MySQL中。我对你的问题做了一些编辑。。。它还说你在找什么吗?是的!这太完美了!!:)欢迎使用堆栈溢出!谢谢!让我们试试这个!派对:)太好了!!!!这个问题让我头疼,即使不是什么大问题,我还是很感激
    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