2012-01-12 7 views
2

Предположим, что у меня есть три значения в PHP: «a», «b», «c». Не имеет значения, в строке или в запятой.
Существует таблица в базе данных:Выберите значения, которые НЕ указаны в таблице

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

Моя цель состоит в том, чтобы найти значения, которые находятся в массиве PHP, но не в таблице базы данных.
Данный пример даст «c».
Могу ли я сделать это только с одним запросом?

UPDATE

получил несколько хороших предложений в ответах о array_diff(), хотя в моем случае таблица DB действительно большое и массив имеет не более 5-6 пунктов. Так что было бы лучше выполнить 5-6 запросов, я думаю.

+0

ли вы _really_ должны сделать это с помощью запроса SQL? –

+0

Я предпочитаю. И было интересно, возможно ли это. – lvil

ответ

4

Если массив PHP коротка, вы можете построить UNION ALL запрос, чтобы построить свой небольшой стол , а затем использовать NOT IN или LEFT JOIN запрос (в зависимости от того быстрее) против большой стол:

SELECT value 
FROM (
    SELECT 'a' AS value 
    UNION ALL 
    SELECT 'b' 
    UNION ALL 
    SELECT 'c' 
) AS php_array_values 
WHERE value NOT IN (
    SELECT value 
    FROM that_large_table 
); 

В качестве альтернативы вы можете вставить значения массива php во временную таблицу и использовать запросы или 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: вы правы. Запрос LEFT JOIN, показанный в примере 2, будет работать с обоими примерами. –

0

Вы можете выбрать все записи в таблице, а затем выполнить команду array_diff().

Но это не один запрос, это один запрос и некоторая пост-обработка.

0

Для этого я бы тянуть значения из таблицы в массив и использовать array_diff

REF: http://www.php.net/manual/en/function.array-diff.php

+0

Спасибо. Хорошее предложение, хотя в моем случае таблица БД действительно велика, и массив имеет не более 5-6 элементов. Так что было бы лучше выполнить 5-6 запросов, я думаю. – lvil

+0

Достаточно честно, я думал, что это может быть немного тяжело, если стол был действительно большим. Предварительная формовка данных по данным будет полностью неэффективной. Похоже, что выполнение 5-6 запросов было бы более уместным, если бы здесь не возникло что-то. – Bangline

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

Вы можете использовать и или или операторы, если вы хотите. если счетчик возврата для этого запроса равен 0, тогда значения массива уже не существуют в базе данных.

0

Вместо того, чтобы вытаскивать все элементы из БД, вы можете попробовать использовать инструкцию «LIKE», это уменьшит количество записей, выведенных из БД.

что-то подобное:

значения РНР массива: а, б, в

значений DB: а, б, г

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

о/р этого будет: {а , 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 элементов, которые у вас уже есть. Далее, выполните массив_дифф (который не будет тяжелым вообще, так как у вас будет свой начальный малый массив, а массив из них в db, который еще меньше).

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

если что у вас есть строка с разделителями-запятыми, то вам нужно «взорвать» его первым:

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

Если я правильно вас понимаю, ваш ответ - противоположная задача (выберите значения из таблицы, которые не находятся в массиве) – lvil

+0

@lvil oh ... спасибо! я полностью получил его назад. все лучше сейчас :) – davogotland

Смежные вопросы