Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно сделать MULTI-DELETE?
 
 автор: Keyses   (28.06.2009 в 19:35)   письмо автору
 
 

Делаю так:
<?php
MYSQL_QUERY
('DELETE FROM photo, photo_info USING photo, photo_info 
WHERE photo.id = '
.$_POST['album'].' OR photo_info.photo_id = '.$_POST['album']);
?>

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

Подскажите как быть?

  Ответить  
 
 автор: Valick   (28.06.2009 в 21:39)   письмо автору
 
   для: Keyses   (28.06.2009 в 19:35)
 

А нафик делать удаление из двух таблиц одним запросом?

  Ответить  
 
 автор: GeorgeIV   (28.06.2009 в 21:48)   письмо автору
 
   для: Keyses   (28.06.2009 в 19:35)
 

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

  Ответить  
 
 автор: Keyses   (29.06.2009 в 01:57)   письмо автору
 
   для: GeorgeIV   (28.06.2009 в 21:48)
 

Т.е. придётся делать двумя запросами?

  Ответить  
 
 автор: GeorgeIV   (29.06.2009 в 08:51)   письмо автору
 
   для: Keyses   (29.06.2009 в 01:57)
 

я бы сделал двумя

  Ответить  
 
 автор: Trianon   (29.06.2009 в 10:01)   письмо автору
 
   для: Keyses   (29.06.2009 в 01:57)
 

Можно обойтись и одним, если избавиться от идитской запятой между именами таблиц.

  Ответить  
 
 автор: GeorgeIV   (29.06.2009 в 21:47)   письмо автору
 
   для: Trianon   (29.06.2009 в 10:01)
 

Trianon, а в принципе запрос вообще по моему неправильно записан - в списке USING используется список соединяемых столбцов и используется он с JOIN вместо WHERE , или я ошибаюсь (мало работаю в последнее время с БД)

  Ответить  
 
 автор: Trianon   (29.06.2009 в 21:58)   письмо автору
 
   для: GeorgeIV   (29.06.2009 в 21:47)
 

>Trianon, а в принципе запрос вообще по моему неправильно записан - в списке USING используется список соединяемых столбцов

верно.
Может у автора и столбцы такие есть? Хотя это уже врядли...


>и используется он с JOIN вместо WHERE

с JOIN вместо запятой. WHERE тут не при чем
О чем я и написал. На названия столбцов внимание не обратил.

  Ответить  
 
 автор: GeorgeIV   (30.06.2009 в 10:48)   письмо автору
 
   для: Trianon   (29.06.2009 в 21:58)
 

Хочется довести до конца теоретические изыскания :-)
Как я думаю - для соединения таблиц используется либо JOIN либо тета-соединение с WHERE, но одновременного использования я не встречал. И при JOIN USING используется, если список имен используемых столбцов в обеих таблицах совпадает (рассматриваем вариант для двух объединяемых страниц), иначе используется ON с условиями соединения.

  Ответить  
 
 автор: Trianon   (30.06.2009 в 11:06)   письмо автору
 
   для: GeorgeIV   (30.06.2009 в 10:48)
 

>Хочется довести до конца теоретические изыскания :-)
>Как я думаю - для соединения таблиц используется либо JOIN либо тета-соединение с WHERE, но одновременного использования я не встречал.
Никто не мешает на результирующую таблицу наложить через WHERE
а) дополнительные условия (описывающие не правила соединения, а фильтр отбора)
б) для внешнего соединения - обратное условие. Например, чтобы отобрать не сочетающиеся строки.


При JOIN USING используется, если список имен используемых столбцов в обеих таблицах совпадает
не всех, а лишь тех (или даже того в большинстве случаев) , по которому выполняется соединение.


Поскольку USING в MySQL претерпела относительно недавние довольно сильные семантические изменения Join Processing Changes in MySQL 5.0.12 то применяют эту достаточно удобную форму пока что с опаской, дабы избежать разночтения...

  Ответить  
 
 автор: GeorgeIV   (30.06.2009 в 13:15)   письмо автору
 
   для: Trianon   (30.06.2009 в 11:06)
 

ммм... да, сильно стал отставать от MySQL. пора читать....

  Ответить  
 
 автор: Keyses   (09.07.2009 в 00:35)   письмо автору
 
   для: Trianon   (29.06.2009 в 10:01)
 

Почитав немного это:

For the first multiple-table syntax, only matching rows from the tables listed before the FROM clause are deleted. For the second multiple-table syntax, only matching rows from the tables listed in the FROM clause (before the USING clause) are deleted. The effect is that you can delete rows from many tables at the same time and have additional tables that are used only for searching:
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;


Or:
DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;


These statements use all three tables when searching for rows to delete, but delete matching rows only from tables t1 and t2.

The preceding examples use INNER JOIN, but multiple-table DELETE statements can use other types of join allowed in SELECT statements, such as LEFT JOIN. For example, to delete rows that exist in t1 that have no match in t2, use a LEFT JOIN:
DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;


Сделал так:
<?php
MYSQL_QUERY
('DELETE photo, photo_info
FROM photo
  LEFT JOIN photo_info
    ON photo_info.photo_id = '
.$_POST['album'].'
WHERE photo.id = '
.$_POST['album']);
?>


Всё прекрасно работает :)

  Ответить  
 
 автор: Trianon   (09.07.2009 в 00:42)   письмо автору
 
   для: Keyses   (09.07.2009 в 00:35)
 

У Вас запрос явно с ошибкой синтаксиса.


Кроме того, тогда уж
mysql_query('
DELETE photo, photo_info
  FROM photo
    LEFT JOIN photo_info
      ON photo_info.photo_id = photo.id
  WHERE photo.id = '. $_POST['album']); 


Хотя вполне можно обойтись двумя независимыми запросами.

  Ответить  
 
 автор: Keyses   (09.07.2009 в 01:23)   письмо автору
 
   для: Trianon   (09.07.2009 в 00:42)
 

точно, сенкс :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования