[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: массиф в sql запросе
aybulat
Есть массив элементов $ar.
Необходимо из таблицы удалить строки у которых значение определенного поля не входит в этот массив.
В общем не пойму как массив(целиком а не отдельные элементы) использовать в sql запросе.

delete from table where field not in ...

Или нет так?....

И ещё такой вопрос.
Как такой массив преобразовать в обычный
Array ( [0] => SimpleXMLElement Object ( [0] => 12 ) [1] => SimpleXMLElement Object ( [0] => 21 ))

вот в такой
Array ( [0] => 12 [1] => 21)



Спустя 59 минут, 42 секунды (21.02.2009 - 17:33) sergeiss написал(а):
SQL
delete from table where field not in (1, 2, 3, 5, 7)

или
SQL
delete from table where field not in (select distinct another_key_field from another_table where `date` <= '2009-02-10')

Там может быть как простой перечень, так и выборка из любой таблицы, любого поля того же типа.
Во втором случае сначала будут найдены все (уникальные) значения определенного поля из второй таблицы, из записей, для которых дата меньше 10 февраля. И потом будут удалены значения из первой таблицы, для которых значение поля попадет в выборку.

Спустя 2 часа, 51 минута, 12 секунд (21.02.2009 - 20:24) aybulat написал(а):
Нет этот самый перечень у меня записан в PHP массив, размер которого заранее не известен, поэтому первый вариант отпадает.
Ну не работает эта конструкция
$ar = array('1', '2', '3', '4', '5');

delete from table where field not in $ar

Насчет второго, здесь я так понял нужно создавать временную таблицу и заполнять её из задонного массива, тогда этот вариант подойдет.

А нельзя ли обойтись без временной таблицы?

На второй вопрос первого поста кто нибудь ответит?

Спустя 17 минут, 47 секунд (21.02.2009 - 20:42) Viking написал(а):
sql на прямую не может с архивами работать, для конструкции с IN преобразуй его в строку:
"delete from table where field not in (".join(","$ar).")"

на счет второго - имхо копать в сторону array_map

Спустя 1 час, 3 минуты, 2 секунды (21.02.2009 - 21:45) sergeiss написал(а):
А зачем ты создаешь массив? У меня в тексте не было массива, а был только перечень величин. Который не является массивом, а именно простой, "тупой" перечень через запятую.
Во втором варианте не надо создавать никакую временную таблицу!!! Она создается на время выполнения запроса. Как часть запроса. По окончании выполнения запроса уже нету никакой временной таблицы, она будет удалена автоматически. И создается она на основании каких-то данных из БД.

Спустя 1 час, 48 минут, 54 секунды (21.02.2009 - 23:34) aybulat написал(а):
Цитата (sergeiss @ 21.02.2009 - 18:45)
А зачем ты создаешь массив? У меня в тексте не было массива, а был только перечень величин. Который не является массивом, а именно простой, "тупой" перечень через запятую.
Во втором варианте не надо создавать никакую временную таблицу!!! Она создается на время выполнения запроса. Как часть запроса. По окончании выполнения запроса уже нету никакой временной таблицы, она будет удалена автоматически. И создается она на основании каких-то данных из БД.

Дело в том, что массив создаётся во время чтения xml-файла, перечень значений берется именно из него(xml-файла), а не из таблицы БД, размерность массива зависит от количества записей в файле, поэтому просто перечислить их тоже не получится. Скрипт вызывается по крону и каждый раз xml-файл будет новым.

Viking, большое спасибо эта задача решена.

Спустя 18 минут, 15 секунд (21.02.2009 - 23:52) sergeiss написал(а):
Цитата (aybulat @ 21.02.2009 - 23:34)
Дело в том, что массив создаётся во время чтения xml-файла, перечень значений берется именно из него(xml-файла), а не из таблицы БД, размерность массива зависит от количества записей в файле, поэтому просто перечислить их тоже не получится. Скрипт вызывается по крону и каждый раз xml-файл будет новым.

"Элементарно, Ватсон!" (С) smile.gif

Вот смотри. Есть такая функция, implode называется. В твоем случае как раз то, что надо.
Предположим, что у тебя данные записаны в массив $a.
Тогда запрос так можно сформировать:
PHP
$sql='delete from table where field not in ('implode(','$a) .')';

То есть, мы из массива сделаем строку с данными, перечисленными через запятую. Вставляем этот перечень в нужное место запроса... И получаем тот самый запрос, о котором я ранее говорил.

Спустя 16 минут, 37 секунд (22.02.2009 - 00:09) aybulat написал(а):
sergeiss, ну и тебе спасибо, Viking уже рассказал. Я просто забыл о существовании этой функции.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.