2016-07-27 24 views
-1

如果我有一個數據庫有2個字段,Roll noname,我有一個列表(n個值)的卷號,我必須搜索相應的名稱。在1個查詢中搜索多個值

這可以使用SQLHQL中的一個查詢完成嗎?

+0

是的,它可以。閱讀有關'IN'運算符 – Jens

+0

當列表的大小是動態的時,我怎樣才能使用IN運算符? –

+0

從你打電話給你的查詢? – Jens

回答

0
SELECT name FROM [table] WHERE id IN ([list of ids]) 

其中[list of ids]是例如2,3,5,7

+0

該列表是可變的...列表的大小和值不是預定義的。我即時獲得列表。 –

+0

該列表可能是可變的。查詢從不可變。查詢是查詢。你可能應該在你做查詢的地方顯示代碼。 – Jakumi

0

使用IN經營者和用逗號分隔的Roll no的。

SELECT name 
FROM yourtable 
WHERE [Roll no] IN (1, 2, 3, 4, etc) 
0

您可以使用上面顯示的IN語句。

這有幾個小問題。如果子句中的值數量太大,它可能表現不佳。

的第二個問題是,在許多開發環境,你的土地幾乎需要與項目的可變數量(或者,如果使用參數化查詢的佔位符的變量數)動態地創建查詢。如果你的代碼看起來很亂並且意味着你沒有一個好的整齊的SQL,你可以拷貝並用它來測試,這並不難。

但是示例(使用php)。

這裏IN只是用SQL動態創建的。假設卷號只能是整數,它將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綁定參數有點麻煩。這是因爲綁定參數語句需要可變數量的參數。第二個參數是要綁定的值,它期望它們通過引用傳遞。所以這裏在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類可以很容易地插入多個記錄 - 我只是不斷地將它們傳遞給它們,並且類將它們分批並偶爾插入它們以避免重複擊中數據庫)。