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_Arrays_Subquery - Fatal编程技术网

Php 编写查询以获取数组并在子查询中使用该数组

Php 编写查询以获取数组并在子查询中使用该数组,php,mysql,arrays,subquery,Php,Mysql,Arrays,Subquery,我试图做的是从第一个查询中获取结果,将它们传递到数组中,然后在子查询中使用它们。如果我手动将id输入到子查询中,这两个查询将分别工作。有没有办法将这两个查询链接起来 我用过这个代码 $result = mysql_query("SELECT v2.video_id as v2id FROM VideoTags AS v1 JOIN VideoTags AS v2 USING ( tag_id ) WHERE v1.video_id =1 AND v1.video_id <> v2.v

我试图做的是从第一个查询中获取结果,将它们传递到数组中,然后在子查询中使用它们。如果我手动将id输入到子查询中,这两个查询将分别工作。有没有办法将这两个查询链接起来

我用过这个代码

$result = mysql_query("SELECT v2.video_id as v2id FROM VideoTags AS v1 JOIN VideoTags AS v2 USING ( tag_id ) WHERE v1.video_id =1 AND v1.video_id <> v2.video_id GROUP BY v2.video_id ORDER BY COUNT( * ) DESC"); 

$values = array();

while ($row = mysql_fetch_array( $result )) {
  $values[] = $row['v2id'];
}

echo join(", ", $values);

$resultone = mysql_query("SELECT * FROM videos WHERE video_id IN (' . join(',', $values). ')"); 

while ($row = mysql_fetch_array( $resultone )) {
  echo "name ".$row['video_name'];
}
谢谢你的帮助。

这就足够了

$resultone = mysql_query("SELECT * FROM videos WHERE video_id IN (SELECT v2.video_id as v2id FROM VideoTags AS v1 JOIN VideoTags AS v2 USING ( tag_id ) WHERE v1.video_id =1 AND v1.video_id <> v2.video_id GROUP BY v2.video_id ORDER BY COUNT (*) DESC)"); 

while ($row = mysql_fetch_array( $resultone )) {
  echo "name ".$row['video_name'];
}

但在使用类似的查询之前,请检查您的mysql版本是否支持子查询。

您可以在一个查询中完成此操作

$innersql = "SELECT v2.video_id FROM VideoTags AS v1 JOIN VideoTags AS v2 USING ( tag_id ) WHERE v1.video_id =1 AND v1.video_id <> v2.video_id GROUP BY v2.video_id ORDER BY COUNT( * ) DESC"); 

$sql= mysql_query("SELECT * FROM videos WHERE video_id IN (" . $innersql .")"); 

while ($row = mysql_fetch_array( $resultone )) {
  echo "name ".$row['video_name'];
}

希望这有帮助。

是的,它被称为子查询,您使用的不是子查询,因为它不包含一个查询和另一个查询

SELECT * 
FROM videos 
WHERE video_id IN (
    SELECT v2.video_id 
    FROM VideoTags AS v1 
    JOIN VideoTags AS v2 USING ( tag_id ) 
    WHERE v1.video_id =1 AND v1.video_id <> v2.video_id 
    GROUP BY v2.video_id ORDER BY COUNT( * ) DESC
)

计数*没有意义?

您知道第二个查询中的连接在错误的语音标记内,您使用单引号来分隔双引号。据我所知,您希望您的mysql查询返回与第一个查询中相同的行。为什么?你有链接或文档来支持这一说法吗?我发现连接比子查询性能更好…@Leslie:对不起,我不是说子查询在所有情况下都更好,但在这种情况下它比连接更好。join也很好,但在这种情况下join并不是更好,因为我们知道要过滤的值。如果我在过去打瞌睡时发现了这个。我记得的是:join将每一行和另一个表的每一行进行比较,若表1有10行,而表2有10行,则join执行10*10,即100个场景。但在子查询中,它获取并检查它,因此它只有10个场景+子查询执行时间。如果我错了,请告诉我。
SELECT * FROM VideoTags AS v1 JOIN VideoTags AS v2 USING ( tag_id )   
inner join video vi on vi.video_id = v1.video_id   
WHERE v1.video_id =1 AND v1.video_id <> v2.video_id GROUP BY v2.video_id ORDER BY COUNT( * ) DESC");