2010-08-31 2 views
0

У меня есть таблица вроде этого:Общее однократное SQL запрос

id | roll_no | name 
--------------------- 
1 | 111 | Naveed 
2 | 222 | Adil 
3 | 333 | Ali 

Если у меня есть данные, как это:

$fields = array("id" , "roll_no") и $values = array("1,111", "2,222");

Это означает, что я должен написать SQL запрос для получения записей из таблицы, где (id! = 1 и roll_no! = 111) и (id! = 2 и roll_no! = 222). Это означает, что будет извлечена 3-я запись.

Если у меня есть данные, как это:

$fields = array("id") и $values = array("2", "3");

Это означает, что я должен написать запрос SQL для получения записей из таблицы, где (! Ид = 2) и (ID = 3). Это означает, что будет извлечена первая запись.

Вопрос: Как написать общий одиночный запрос с использованием php для получения данных из таблицы, используя выше двух массивов данных.

Благодаря

ответ

3
select * from dummy where concat_ws (',', id, roll_no) not in ('1,111', '2,222') 

Комплексное решение:

$tableName = "test"; 
$fields = array("id" , "roll_no"); 
$values = array("1,111", "2,222"); 

$fieldsStr = implode(',', $fields); 
$valuesStr = implode("','", $values); 
$sql = "SELECT * 
    FROM $tableName 
    WHERE concat_ws(',', $fieldsStr) NOT IN ('$valuesStr')"; 
+0

Хорошо. Спасибо – NAVEED

+0

Thats выглядит здорово. Благодарю. – NAVEED

+0

Удалите пробел между 'concat_ws' и' ('. Это вызывает эту ошибку на сервере:' FUNCTION CONCAT_WS не существует' – NAVEED

0

Вы, вероятно, всегда должны взорвать Array в PHP и передавать данные в виде строки в запросе (sprintf), так что вы, наверное, можно, и нужно, делать все в PHP.

Единственное, что бросается в глаза, это то, что вы всегда используете ID. Являются ли идентификаторы уникальными или первичными? Если так, просто забудьте о roll_no, так как ваш запрос будет быстрее, используя только идентификаторы.

+0

Да, вы правы. Поля являются первичными ключами. Выше логика может быть реализована для разных таблиц с различными комбинациями первичных ключей, поэтому я привел два примера данных. Я знаю, что он будет включать часть PHP-кода. – NAVEED

0

Комплексное решение с помощью принятого ответа.

$tableName = "test"; 
$fields = array("id" , "roll_no"); 
$values = array("1,111", "2,222"); 

$fieldsStr = implode(',', $fields); 
$valuesStr = implode("','", $values); 

// Get all records from remote table 
$sql = "SELECT * FROM $tableName WHERE concat_ws(',', $fieldsStr) NOT IN ('$valuesStr')"; 
+0

Этот ответ был опубликован перед полным решением от принятого автоответчика. – NAVEED

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