Страшный sql-запрос

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Страшный sql-запрос

Сообщение Ekstazi »

Недавно написал вот такой вот страшный запрос:

Код: Выделить всё

delete Region, City, Salon, SaleType, BirthDay, `Comment`,`Delivery`,`Mail` from Region 
left join City on City.idRegion=Region.Id
left join Salon on Salon.idCity=City.Id
left join `SaleType` on SaleType.idSalon=Salon.Id
left join `BirthDay` on BirthDay.idSalon=Salon.Id
left join `Comment` on `Comment`.idSalon=Salon.Id
left join `Delivery` on Delivery.idSalon=Salon.Id or Delivery.idCity=City.Id
left join `Mail` on Mail.idSalon=Salon.Id
where Region.idCountry=1000000
Задача в том чтоб при удалении страны удалить все области, со всеми городами, со всеми салонами в нем, учитывая информацию о днях рождениях, доставке, комментариях и письмах.

Может кто знает как это дело можно упростить ?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Страшный sql-запрос

Сообщение slavcodev »

лучше удалить страну только, и потом кроном раз в месяц удалить все города которые без стран одним запросом
я бы так сделал
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Страшный sql-запрос

Сообщение Ekstazi »

А если нет крона ?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Страшный sql-запрос

Сообщение slavcodev »

застрелится
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Страшный sql-запрос

Сообщение slavcodev »

просто скорее всего города и прочее никогда не выскочит если страна была удалена.
поэтому удалять сразу тем же запросом и их, это накладно
может если нет крона, удалять города призраки при добавлении нового города
но хотя страны ведь не так часто удаляются, мб можно этим пожертвовать.
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Страшный sql-запрос

Сообщение Ekstazi »

Написал класс-хелпер чтоб немного облегчить задачу:

Код: Выделить всё

class SqlHelper
{
    public static function deleteJoin($from,$params)
    {
//        $sql='DELETE'.
        $joins=array();
        foreach($params as $table=>$condition)
        {
            $joins[]="LEFT JOIN {$table} ON {$condition}";
        }
        return $sql='DELETE '.implode(',',array($from)+array_keys($params))." FROM $from\n".implode("\n",$joins);
    }
    //put your code here
}
 
Использую так:

Код: Выделить всё

        var_dump(SqlHelper::deleteJoin('Region',array(
            'City'=>'City.idRegion=Region.Id',
            'Salon'=>'Salon.idCity=City.Id',
            '`SaleType`'=>'SaleType.idSalon=Salon.Id',
            '`BirthDay`'=>'BirthDay.idSalon=Salon.Id',
            '`Comment`'=>'`Comment`.idSalon=Salon.Id',
            '`Delivery`'=>'Delivery.idSalon=Salon.Id or Delivery.idCity=City.Id',
            '`Mail`'=>'Mail.idSalon=Salon.Id'
        )));
 
Костыль, но помогает.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Страшный sql-запрос

Сообщение Ekstazi »

Такое требование в тз было, а раз плотят, то мне пофиг :) Ограничение на выполнение скрипта= 1 секунда. При базе в 400 объектов-салонов такой запрос вполне допустим думаю. Локальные тесты показали очень неплохую скорость выполнения запроса
theKiller
Сообщения: 153
Зарегистрирован: 2010.02.28, 22:58

Re: Страшный sql-запрос

Сообщение theKiller »

А релейшены INNODB нельзя задействовать? Тогда все само удалится при удалении корневого узла.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Страшный sql-запрос

Сообщение Ekstazi »

Разве ? Я не пользовался никогда этим.
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Страшный sql-запрос

Сообщение AbS_ »

Ekstazi писал(а):Разве ? Я не пользовался никогда этим.
да. произойдет каскадное удаление связанных данных.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Страшный sql-запрос

Сообщение SpiLLeR »

тоже бы воспользовался возможностями InnoDb ON DELETE CASCADE.
Предупрежден - значит вооружен.
devKP.ru
Ответить