SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.04.2009 09:51:59

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Mysql запросы

добрый день, у меня проблема с базой, мучаюсь уже недели 2
строение такое:
таблица устройство
id(auto_incr)    ustroistvo(УНИКАЛЬНЫЙ)    author

1    Редутор    flip
2    Механизм    vova

таблица поиск
id(auto_incr)    id_ustr    id_instr
1    1    1
2    1    2
3    1    3
4    2    2
4    2    3   

таблица инструменты
id(auto_incr)    instr(уникальный)    massa
1    молоток    2
2    стамеска    1,2
3    клещи    0,7

надеюсь понятно, что таблица поиск объединяет таблицы устройство и инструменты
помогите сделать правильное добавление в базу и правильное удаление

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

мои запросы на добавление:

insert into ustr ('0', редуктор)
//узнаем номер добавленного устройства
$n_ustr=select ustroistvo from ustr where ustroistvo='редуктор'
//количество инструментов, соответствующих данному устройству

$num_rows_instr=3

for ($i=0;$i<$num_rows_instr;$i++)
{
//добавление в таблицу инструментов, в примере 1 шаг цикла
insert into instr ('0','молоток')
//выбираем id добавленного инструмента
$n_instr=select id from instr where instr='молоток'
//добавляем связь инструмента и устройства в таблиц поиск
insert into poisk ('0','$n_ustr','$n_instr')
}

все показано схематично, кстати перестаньте смпеяться, я действиетльно "деревня"
косяк в том, что id в ustr и id в instr - auto_increment и я не знаю их значения, до добавления в соответствующие таблицы, приходится каждый раз добавлять и сразу выбирать.

таблица инструменты заполняется в процессе заполнения таблицы устройств, тоесть из формы я передаю все данные по устройству + данные по некоторым инструментам, если данный инструмент есь в базе то выбироаю его номер и добавлчяю в таблицу поиск, если он новый - то добавляю его, выбираю id добавленного инструмента, и потом добавляю в таблицу поиск.

на самом деле, это все написано, но багов - куча... думаю сделать заново и получше. если никто не поможет, заполню до упора руками таблицу инструменты, и не буду туда добавлть.

Может сделать связи таблиц?
между инструментами и поиском instr.id referent poisk.id_instr on delete restrict on update cascade

Неактивен

 

#2 18.04.2009 17:07:37

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Mysql запросы

Ммм... ну во первых узнать ID добавляемого инструмента можно php функцией mysql_insert_id() вызвав оную сразу после выполнения запроса smile

косяк в том, что id в ustr и id в instr - auto_increment и я не знаю их значения, до добавления в соответствующие таблицы, приходится каждый раз добавлять и сразу выбирать.

А значения то одинаковы? Просто не особо понятна ваша проблема и тип таблиц было бы полезно указать smile

Неактивен

 

#3 18.04.2009 18:16:49

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Re: Mysql запросы

InnoDB но для меня не важен их тип smile
значения не одинаковы, просто это уникальные значения, чтоб легче было делать выборку.
проблема, в оптимизации запросов, например можно в 2 таблицы добавлять 1 запросом, или выбирать из 2 таблиц сразу.

Неактивен

 

#4 18.04.2009 22:47:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Mysql запросы

Насколько я понимаю, проблема именно в том, чтобы переименовать «молотк» в «молоток» при уже
существующем нормальном молотке. И стандартными средствами это никак не сделать, нужно писать
какой-то умный код. Я бы делал по такому алгоритму:

1. Переименовать «молотк» в «молоток». Если получили ошибку («молоток» уже есть), то:
2. Оставить «молоток» в покое, он уже и так хороший.
3. Добавить в таблицы связей связи «молотк»а с id «молоток»а (игнорируя ошибки уникальности).
4. Удалить «молотк».

Пример.
молоток = 1
молотк = 2
таблица связей:
инструмент | устройство
----------------------------
.            1  | 1
.            1  | 3
.            2  | 7
.            2  | 3

После переименования должно получиться:
1 | 1
1 | 3
1 | 7

четвертая строка не прошла проверки уникальности и была выкинута.

Неактивен

 

#5 18.04.2009 23:39:07

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Re: Mysql запросы

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

вхоные данные $instr-инструмент $class_классификация id_instr-номер инструмента  $ustr_id-номер редактируемого устройства

$res=mysql_query('SELECT * FROM `instr` WHERE `instr` = \''.$instr.'\'');
$numrows=mysql_num_rows($res2);

если в базе нет такойже записи то нумровз=0 и добавляем

if ($numrows==0)
          {
          mysql_query('INSERT INTO `ingridients` (`id`, `instr`, `class1`, `class2`, `edizm`) VALUES
                 (\'0\',
                 \''.$instr.'\',
                 \''.$class.'\',)');
          mysql_query("DELETE FROM instr WHERE id = '".$id_instr."'");
          $sel_id_instr=mysql_query("SELECT id FROM instr WHERE instr = '".$instr."'");
          $id_instr = mysql_result($sel_id_ingr, 0, 'id');
          mysql_query("UPDATE poisk SET id_instr='".$id_instr."' WHERE id_ustr='".$ustr_id."', id_instr='".$$id_instr."'");
          }
если нумровз >0 то такой инстурмент уже есть, и надо исправлять
else
          {
              $del_instr = mysql_query("DELETE FROM instr WHERE id = '".$id_instr."'");
              $sel_id_ingr=mysql_query('SELECT * FROM instr WHERE instr = \''.$instr.'\'');
              $id_instr = mysql_result($sel_id_instr, 0, 'id');
              $upd_poisk=mysql_query("UPDATE poisk SET id_instr='".$id_instr."' WHERE id_ustr='".$ustr_id."' AND id_instr='".$id_instr."'");
          }

Неактивен

 

#6 18.04.2009 23:57:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Mysql запросы

Обратите внимание: Вы хотите удалить старый молоток. А я предлагаю старый молоток
не удалять. В этом большая разница smile

Неактивен

 

#7 19.04.2009 02:06:54

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Re: Mysql запросы

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson