[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: delete с select в условии
achyorny
можно ли это:
$result = $this->db->query("SELECT * FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)");
foreach ($result->rows as $item)
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` ='".(int)$item['product_id']."'" );

заменить этим:
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)" );
?
FatCat
Можно, но не нужно: работать будет намного медленнее.

_____________
Бесплатному сыру в дырки не заглядывают...
SlavaFr
Цитата (achyorny @ 22.11.2011 - 21:50)
можно ли это:
$result = $this->db->query("SELECT * FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)");
foreach ($result->rows as $item)
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` ='".(int)$item['product_id']."'" );

заменить этим:
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)" );
?

не только можно, но и нужно заменить.
Первый вариант безсмысленно палит ресурсы.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
linker
FatCat
Интересно, что быстрее перебрать в цикле 100 записей и выполнить 100 запросов, или формально двумя запросами сразу?

_____________
Gear Framework
Gear Framework на Github
Placido
Вместо того чтобы перебирать каждую запись из таблицы product_to_store, сравнивая с каждой записью из таблицы product, лучше удалить записи, предварительно объединив таблицы через LEFT JOIN.
DELETE `t1` 
FROM `product_to_store` `t1` LEFT JOIN `product` `t2` ON `t1`.`product_id` = `t2`.`product_id`
WHERE `t2`.`product_id` IS NULL
achyorny
Цитата (Placido @ 23.11.2011 - 06:24)
Вместо того чтобы перебирать каждую запись из таблицы product_to_store, сравнивая с каждой записью из таблицы product, лучше удалить записи, предварительно объединив таблицы через LEFT JOIN.
DELETE `t1` 
FROM `product_to_store` `t1` LEFT JOIN `product` `t2` ON `t1`.`product_id` = `t2`.`product_id`
WHERE `t2`.`product_id` IS NULL

это лучше для сервера?
чем
DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)
?
dadli
achyorny
думаю ваш :
DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)

варянт совсем достаточно.
просто проиндескируите нужние поли в таблицах

_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

achyorny
Цитата (dadli @ 23.11.2011 - 12:11)
achyorny
думаю ваш :
DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)

варянт совсем достаточно.
просто проиндескируите нужние поли в таблицах

а зачем вообще индексировать, что оно дает?
dadli
achyorny
если индексировать product_id в таблице product_to_store то мускл будит намного бистрее поискать нужние записи, так как не будит пересмотреть все записи.

_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Placido
Цитата (achyorny @ 23.11.2011 - 12:00)
это лучше для сервера?чем...

Да в этом случае одинаково, думаю. Это я немного прогнал ))

Цитата (dadli @ 23.11.2011 - 13:03)
если индексировать product_id в таблице product_to_store


Только индексировать нужно поле product_id в таблице product. В таблице product_to_store в любом случае будут перебраны все product_id, и индекс там использоваться не будет.
achyorny
ок, всем спасибо!
dadli
Placido
Цитата
Только индексировать нужно поле product_id в таблице product. В таблице product_to_store в любом случае будут перебраны все product_id, и индекс там использоваться не будет.


нет, наоборот, все записи будит вибран из таблиц product и не нужно его поле индексировать, а нужно индескировать product_id в таблице product_to_store. разве не так?
а вообшем если в подзапросе будит балшое киличество product_id-ов не нада вообшем индекси исползовать, в етом случае индекси уже будит лишнее.


_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Placido
Каждая из записей в product_to_store проверяется на соответствие условию (NOT IN ...) - то есть осуществляется простой перебор таблицы product_to_store, и смысла в использовании индекса там нет, а вот в таблице product осуществляется поиск.

Не хочу спорить - это очень легко проверить. Создайте индексы для поля product_id в обеих таблицах и проверьте с помощью EXPLAIN, какой индекс используется. Для приведенных выше запросов будет использоваться только один из этих индексов.
achyorny
ахахах))))))
Быстрый ответ:

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