如果我有一个包含2个字段Roll no
和name
的数据库,并且我有一个滚动号的列表(n个值),我必须搜索相应的名称。
这可以仅使用SQL
或HQL
中的一个查询来完成吗?
答案 0 :(得分:0)
SELECT name FROM [table] WHERE id IN ([list of ids])
其中[list of ids]
例如2,3,5,7
。
答案 1 :(得分:0)
使用IN
运算符,并用逗号分隔Roll no
。
SELECT name
FROM yourtable
WHERE [Roll no] IN (1, 2, 3, 4, etc)
答案 2 :(得分:0)
您可以使用如上所示的IN语句。
这有一些小问题。如果子句中的值数量太大,它可能表现不佳。
第二个问题是,在许多开发环境中,您需要动态创建具有可变数量项的查询(如果使用参数化查询,则需要可变数量的占位符)。虽然并不困难但是如果你的代码看起来很混乱并且意味着你没有得到一个很好的SQL,你可以复制并用来测试。
但是例子(使用php)。
这里的IN只是用SQL动态创建的。假设roll数字只能是整数,它将intval()应用于数组的每个成员,以避免在SQL中使用任何非整数值。
<?php
$list_of_roll_no = array(1,2,3,4,5,6,7,8,9);
$sql = "SELECT FROM some_table WHERE `Roll no` IN (".implode(", ", array_map ('intval', $list_of_roll_no)).")";
?>
使用mysqli绑定参数有点乱。这是因为bind参数语句需要可变数量的参数。第二个参数是要绑定的值,它希望它们通过引用传递。所以这里的foreach用于生成一系列引用: -
<?php
$list_of_roll_no = array(1,2,3,4,5,6,7,8,9);
if ($stmt = $mysqli->prepare("SELECT FROM some_table WHERE `Roll no` IN (".implode(",", array_fill(0, count($list_of_roll_no), '?')).")"))
{
$bind_arguments = [];
$bind_arguments[] = str_repeat("i", count($list_of_roll_no));
foreach ($list_of_roll_no as $list_of_roll_no_key => $list_of_roll_no_value)
{
$bind_arguments[] = & $list_of_roll_no[$list_of_roll_no_key]; # bind to array ref, not to the temporary $recordvalue
}
call_user_func_array(array($statement, 'bind_param'), $bind_arguments);
$statement->execute();
}
?>
另一种解决方案是将所有值推送到另一个表中。可以是临时表。然后在表和临时表之间使用INNER JOIN来查找匹配的值。这取决于你已经拥有的东西,这很容易做到(例如,我有一个php类可以轻松地插入多个记录 - 我只是继续传递它们并且类将它们批处理并偶尔插入它们以避免反复击中它们数据库)。