1

当你需要做这样的事情时:

SELECT * FROM userinfo WHERE id in (18,2,6,4,5)

id 数组来自另一个查询,例如:

$ids = $conn->fetchAll('SELECT origin from action WHERE url = "'.$url.'" AND SUBSTRING(origin,1,3)<>"pct" GROUP BY origin');

如果我需要解析数组以便为查询 ID 提供正确的格式,请执行以下操作:

    $norm_ids = '(';
    foreach ($ids as $ids) {
        $norm_ids .= $ids['origin'] .',';
    }
    $norm_ids = substr_replace($norm_ids ,"",-1) .')';

输出的 id 如下:(id1,id2,id3,id.......),所以我会:FROM userinfo WHERE id in ". $norm_ids;

但对我来说似乎很难看,有没有办法更好地做到这一点?

4

4 回答 4

3

你可以这样做:

$idStr = rtrim(str_repeat('?,', count($ids), ',');
$query = 'SELECT * FROM userinfo WHERE id in (' . $idStr . ')';

然后使用prepare()

$conn = $db->prepare($query);
$conn->execute($ids);
$res = $conn->fetchAll(...);
于 2013-01-26T11:07:04.040 回答
1
SELECT * FROM user_info WHERE id IN (SELECT origin from action ......) ....
于 2013-01-26T11:07:23.307 回答
1

您需要单独的 id 还是可以将它们组合成 1 个查询?

也许是这样的:

SELECT * FROM userinfo WHERE id in (SELECT origin from action WHERE url = "'.$url.'" AND SUBSTRING(origin,1,3)<>"pct" GROUP BY origin');  

这样你就可以让 sql server 完成工作了。

于 2013-01-26T11:09:16.500 回答
1

当我遇到这种情况时,我会使用 trim

$norm_ids_str = '';
foreach ($ids as $ids) {
    $norm_ids_str .= $ids['origin'] .',';
}
$norm_ids = '(' . trim($norm_ids_str, ',') . ')';
于 2013-01-26T11:48:54.387 回答