我需要檢查數組中哪些元素不存在於MySQL表中。 我正在進行個別查詢,但它炸燬了我的MySQL。檢查MySQL中不存在的大數組元素的最快方法
回答
您可以使用array_diff()
和select distinct ...
組合,以獲得理想的效果迅速:
$array = [1,2,3,4,5,6,7,8,9,0];
$mysql_array = [];
// $mysql_array = [3,7,9]; // uncomment this if you wish to test without DB data
$sql = 'select distinct id as id from mysql_table';
// mysql querying functions or PDO or whatever
while(looping results)
{
$mysql_array[] = $row['id'];
}
print_r(array_diff($array, $mysql_array));
// If using $mysql_array = [3,7,9]; test data then you will get this result
/*
Array
(
[0] => 1
[1] => 2
[3] => 4
[4] => 5
[5] => 6
[7] => 8
[9] => 0
)
*/
重要提示:
上面介紹的方法具有的潛力如果distinct
查詢r耗盡了可用於PHP腳本的可用內存能夠處理一百萬條或更多的記錄。
這是一個壞主意,因爲它會消耗PHP腳本中無限量的內存,具體取決於MySQL表中不同ID的數量。這可能是數十億美元。 –
@BillKarwin是真的,但OP沒有指定他們的表的大小。我選擇在這裏留下這個答案,因爲總是有不止一種做事方式。我會記下你指出的內存問題。謝謝! – MonkeyZeus
對這個線程的幾個答案和評論誤解了OP所要求的。 OP沒有要求MySQL表中的值不在PHP數組中。 OP詢問了相反的情況:PHP數組中的值不在MySQL表中。
將這些值加載到臨時表中。我假設一個包含整數的變量$array
。這是一次插入多行的代碼。如果這會生成一個比max_allowed_packet
更長的INSERT語句,則分批加載該數組。
$pdo->query("CREATE TEMPORARY TABLE values_to_search (value INT PRIMARY KEY)");
$sql = "INSERT INTO values_to_search (value) VALUES "
. implode(",", array_fill(1, count($array), "(?)"));
$stmt = $pdo->prepare($sql);
$stmt->execute($array);
對正在搜索的表執行外連接。沒有匹配的地方,價值不存在。
$sql = "SELECT v.value
FROM values_to_search AS v
LEFT OUTER JOIN mytable t ON v.value = t.value
WHERE t.value IS NULL";
$stmt = $pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_NUM);
嗨,謝謝你的回答。我使用這個解決方案,它可以工作,但只需要140秒就可以完成17000行的外連接。這是正常的嗎? –
您應該在要加入的值列上有一個索引,但即使沒有索引,我也認爲140秒太長。您的服務器上可能有問題。例如,它是交換?讓系統管理員檢查出來。 –
我使用3核心和4Gb內存的VPS,它比較17k線57k現在需要160秒。 –
我建議的替代解決方案,基於該OP的上下文暗示所有已經註冊的值是要探索這一事實。
編輯:看@MonkeyZeus答案我意識到他們可能已經註冊了不止一次,所以我在下面的查詢中添加了DISTINCT
。
可能會更快,因爲它只使用一個簡單的查詢......但不確定,因爲它也迭代了一個巨大的數組。
另一方面,它不會導致內存問題,因爲只使用fetch()
,而不是fetchAll()
。
假設value
是所涉及的列的名稱和$searched_values
是含有所搜索的值(簡單)陣列:
// make known values and searched values sorted the same
$stmt = $pdo->query('SELECT DISTINCT value FROM mytable ORDER BY value');
sort($searched_values);
$unknown_values = [];
$known_value = NULL;
foreach ($searched_values as $searched_value) {
if (!$known_value) {
// previous known_value already consumed (or end), try to get next one
$known_value = $stmt->fetch()['value'];
}
if ($known_value == $searched_value) {
// consume current known_value
$known_value = NULL;
} else {
// otherwise current $searched_value is unknown, register it:
$unknown[] = $searched_value;
}
}
- 1. 在mySQL表中檢查數組項存在的最快方法
- 2. 查找元素是否存在於未排序數組中的最快方法?
- 3. 檢查數組中的所有元素是否相等的最快方法
- 4. 檢查值存在的最快方法
- 5. 查找數組中不同元素的數量的最快方法
- 6. 檢查數組中存在的元素
- 7. 在PHP中找到最大頻率元素的最快方法
- 8. 檢查數據庫集中是否存在最快的方法
- 9. PYTHON:檢查和編輯結構化數組中元素(如果存在)的最快方法是什麼?
- 10. 最快的方法來檢查,如果可能的數組類存在於一個使用jQuery的元素
- 11. Javascript:檢查元素是否在二維數組中的快速方法?
- 12. 檢查XML元素的最佳方法
- 13. 檢查Python中數組元素的最大長度
- 14. 最快的方法來檢查NodeJs中的文件的存在
- 15. 最快的方式來表示數組在mysql中檢索
- 16. 迭代和訪問numpy數組元素的最快方法?
- 17. 檢查數組元素是否存在
- 18. 檢查數組元素是否存在
- 19. 檢查大量文件中是否存在字符串的最快方法
- 20. 用於檢查數組中是否存在元素的javascript自定義方法
- 21. 這是檢查數組中是否存在元素的正確方法?
- 22. 在Java中搜索堆棧中最大元素的最快方法是什麼?
- 23. 最快的方法來找到極端大數組的數組元素之間的最小差異?
- 24. 在javascript數組中獲取唯一元素數的最快方法
- 25. 查找n個不同數組中常見的最大元素?
- 26. 創建HTML元素的最快方法?
- 27. 在swift中查找二維數組中的最大元素
- 28. Python3快速的方法來檢查元素集合中的元素
- 29. 通過調用方法檢查數組中的單個元素
- 30. WebDriverWait。快速檢查元素存在或不存在
使用與'NOT IN'的查詢。 – h2ooooooo
多大?您可以使用'NOT IN'子句 – Ray
或者創建一個包含數組的數據表並使用外部聯接來查看缺少的內容。或者不存在。 – xQbert