2012-01-12 9 views
2

私はPHPで3つの値を持っているとしましょう: "a"、 "b"、 "c"。配列かカンマで区切った文字列かどうかは関係ありません。
データベース内のテーブルがあります:テーブルにない値を選択

id | value 
1 | a 
2 | b 
3 | d 

私の目的は、PHPの配列ではなく、データベーステーブルにある値を見つけることです。
与えられた例は "c"を与えます。
クエリを1つだけ実行できますか?私の場合、DBテーブルが本当に大きく、配列でない以上5-6以下のアイテムを持っているものの

UPDATE

は、)(array_diffについての回答では、いくつかの良い提案を受信しました。ですから、5-6のクエリを実行する方が良いでしょう。

+0

あなたは_really_ SQLクエリでそれを行う必要がありますか? –

+0

私は好きです。それが可能かどうか疑問に思っていた。 – lvil

答えて

4

0123:、次いで テーブルに対して(速い方) NOT IN又は LEFT JOINクエリを使用

また、一時テーブルにPHP配列の値を挿入し、INまたはJOINのクエリを使用できます。あなたがしたい場合は、演算子を使用してか、またはでき

CREATE TEMPORARY TABLE IF NOT EXISTS php_array_values (value VARCHAR(100)); 

DELETE FROM php_array_values; 

INSERT INTO php_array_values VALUES ('a'), ('b'), ('c'); 

SELECT php_array_values.value 
FROM php_array_values 
LEFT JOIN that_large_table ON php_array_values.value = that_large_table.value 
WHERE that_large_table.value IS NULL 
+0

私は特に最初の解決策が好きです! – Bangline

+0

@Bangline:NB。 「NOT IN」は潜在的な遅さ誘導オペレータである。 –

+0

@nick:そうです。例2に示す「LEFT JOIN」クエリは、両方の例で動作します。 –

0

テーブル内のすべてのエントリを選択し、array_diff()を実行することができます。

これは1つのクエリではなく、1つのクエリといくつかの後処理です。このため

0

私は配列に、テーブルから値を引くとarray_diff

REF使用します:PHPの配列が短い場合、あなたは小さなテーブルを構築するためにUNION ALLクエリを構築することができますhttp://www.php.net/manual/en/function.array-diff.php

+0

ありがとうございます。私の場合、DBテーブルは本当に大きく、配列は5-6個を超えていませんが、良い提案です。ですから、5-6のクエリを実行する方が良いでしょう。 – lvil

+0

テーブルが本当に大きければかなり重いかもしれないと思っていました。前記データに対する差分を事前形成することは完全に非効率的である。確かに、ここでSQLの専門家が何かを思い出さない限り、5-6のクエリを実行する方が適切かもしれません。 – Bangline

0
select max(*) as count from tablename 
where field1 != $arr[0] && field2 != $arr[1] && field3 != $arr[2]; 

:もちろん、これはあなたが3つの余分なクエリを記述終わることを意味します。この問合せの戻りカウントが0の場合、配列値はすでにデータベースに存在しません。

0

DBからすべての要素を引き出すのではなく、「LIKE」ステートメントを使用して試すことができます。これにより、DBから取り出されたエントリの数が削減されます。

このような何か:

PHP配列値:A、B、

DB値C:{A:このなりの、B、D

select value from your_table_name where (value LIKE '%a%') OR (value LIKE '%b%') OR (value LIKE '%c%'); 

O/P 、b}

今すぐを使用してください。array_diff php。

1

これはどうですか?

<?php 
    $a = array('a', 'b', 'c'); 
    $values = implode("','", $a); 
    $sql = "SELECT DISTINCT `value` FROM `mytable` WHERE `value` IN ('$values')"; 
    echo $sql; 

SQLクエリを実行します。結果はあなたがすでに持っている0から3の要素になります。次に、array_diffを実行します(これは重くはありません。なぜなら、最初の小さな配列とdb内の配列の配列が小さいからです)。

$not_in_db = array_diff($a, $array_from_sql_result); 

何を持っていることはカンマ区切りの値を持つ文字列がある場合、その後、あなたが最初にそれを「爆発」する必要があります

$s = "a,b,c"; 
$a = explode(",", $s); 
+0

私はあなたを正しく理解していれば、あなたの答えは反対の仕事です(配列にないテーブルから値を選択してください)。 – lvil

+0

@lvil oh ...ありがとう!私は完全にそれを後方に持っています。すべて今より良い:) – davogotland

関連する問題