我有一个select
我需要扫描一张桌子才能得到结果:
where (p.user in (select f from fl where user =? and block=0))
此表是一个包含超过100万行的大表。这需要一段时间才能阅读。我需要一直阅读它,所以我想我可以读一次然后使用:
where (p.user in ($variable_with_all_results))
我试过了:
$stmt = $mysqli->prepare("select f from f1 where user = '1' and block = 0");
$stmt->execute();
$stmt->bind_result($variable_with_all_results);
但我无法在select
上使用此变量,mysql无法识别它。有什么想法吗?
答案 0 :(得分:1)
你应该能够做到这样的事情:
$stmt = $mysqli->prepare("select GROUP_CONCAT(f) from f1 where user = '1' and block = 0");
$stmt->execute();
$stmt->bind_result($variable_with_all_results);
$stmt->fetch();
请注意,您需要在查询中的GROUP_CONCAT
附近添加f
聚合函数,这会为您提供类似1,5,6
的列表。您还需要在语句上执行fetch
以将结果输入变量。
然后你应该能够像这样建立一个新的查询:
$sql = "SELECT ...
WHERE p.user in ($variable_with_all_results)";
答案 1 :(得分:0)
bind_result
不会以这种方式工作,您应该使用bind_param()
。
但是使用IN (?)
不会。
你需要分别绑定每个id,有些人会这样想:
$stmt->bind_param("select f from f1 where (p.user in (select f from fl where user = IN (?,?,?,?,?) and block=0))", $id1, $id2,$id3, $id4, $id5);
这个答案https://stackoverflow.com/a/17228326/2271198可以更好地解释bind_param
工作的人