Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: INSERT при определенном условии

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Deonis
Отправлено: 23 Ноября, 2012 - 12:44:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Доброго времени суток! Не то чтобы проблема, но всё же ... Предположим, что пользователь может добавить только один комментарий к каждой статье. В таблице коментариев `comments`, кроме остальных полей, есть поля: `article_id` (ID статьи) и `user_id` (ID юзверя). Если без всяких премудростей, то перед добавлением комментария, можно проверить есть ли хоть одна запись, где присутствует и первый, и воторой параметры сразу.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(*) FROM `comments` WHERE `article_id` = '$current_article' AND `user_id` = '$current_user'


И если запись не найдена, то даём добро на добавление нового комментария. И вот я задумался, можно ли как-то это выполнять в одном запросе. Т.е. добавлять запись при определенном условии, что-то типа INSERT ... IF([condition]). Применить для данной задачи конструкцию INSERT IGNOR не получится, т.к. поля не могут быть уникальными. Пересмотрел мануалы, но толи пропустил, толи действительно нет такого аналога.
 
 Top
EuGen Администратор
Отправлено: 23 Ноября, 2012 - 12:47:58
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




0. Создать уникальный ключ по полям (article_id, user_id)
1. Применять (экранирование опущено)
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO comments (article_id,user_id, comment) VALUES ($article_id, $user_id, '$comment')
  2.   ON DUPLICATE KEY UPDATE comment='$comment';

- или INSERT IGNORE (в зависимости от желаемого результата)
Deonis пишет:
т.к. поля не могут быть уникальными

- Сами по себе да. Но, следуя описанной логике, уникальными должны быть пары (article_id, user_id) - см. пункт 0 выше.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Deonis
Отправлено: 23 Ноября, 2012 - 12:56:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




EuGen пишет:
0. Создать уникальный ключ по полям (article_id, user_id)
1. Применять


1. Нам не нужно обновлять, а добавлять запись или нет при определенном условии.
2. Повторю, что уникальные ключи отпадают, т.к. значения в полях article_id и user_id могут повторяться, НО не может повторяться комбинация значений этих полей, т.е.

CODE (htmlphp):
скопировать код в буфер обмена
  1. article_id = 1 AND  user_id = 1 // юзер добавил комент к первой статье
  2. article_id = 2 AND  user_id = 1 // этот же юзер добавил комент ко второй статье
  3. // Эти комбинации(!), а не значения - уникальны
 
 Top
EuGen Администратор
Отправлено: 23 Ноября, 2012 - 12:57:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Deonis пишет:
2. Повторю, что уникальные ключи отпадают, т.к. значения в полях article_id и user_id могут повторяться, НО не может повторяться комбинация значений этих полей, т.е.

EuGen пишет:
0. Создать уникальный ключ по полям (article_id, user_id)

- в чем трудность создать индекс по двум полям(ровно это и имелось ввиду) сразу?
Deonis пишет:
Нам не нужно обновлять, а добавлять запись или нет при определенном условии.
EuGen пишет:
- или INSERT IGNORE (в зависимости от желаемого результата)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 23 Ноября, 2012 - 13:01:58
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а что старый добрый if else уже не катит? Не те понты писать такие примитивные конструкции?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Deonis
Отправлено: 23 Ноября, 2012 - 13:26:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




EuGen пишет:
- в чем трудность создать индекс по двум полям(ровно это и имелось ввиду) сразу?


То есть, когда создаем таблицу, то указываем уникальные ключи как-то так?:

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `comments` (
  2.     `article_id` int(10) NOT NULL,
  3.     `user_id` int(10) NOT NULL,
  4.     /* ... */
  5.     UNIQUE KEY `some_key` (`article_id`, `user_id`)
  6. ) ;


C таким не сталкивался, поэтому поправьте, если не так. И, если можно, то каким запросом можно объединить ключи, если таблица уже создана?
 
 Top
EuGen Администратор
Отправлено: 23 Ноября, 2012 - 13:34:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Поправлю (остальные поля, разумеется, тоже нужно добавить):
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `comments` (
  2.     `article_id` int(10) NOT NULL,
  3.     `user_id` int(10) NOT NULL,
  4.     UNIQUE KEY `some_key` (`article_id`, `user_id`));

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Deonis
Отправлено: 23 Ноября, 2012 - 13:46:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




EuGen, спасибо за помощь. И не подскажите по поводу того, как запросом можно создать индекс по этим полям? Или это можно сделать только при создании таблицы?
 
 Top
EuGen Администратор
Отправлено: 23 Ноября, 2012 - 13:47:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Можно, конечно:
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE comments ADD UNIQUE KEY `some_key` (`article_id`, `user_id`);


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Deonis
Отправлено: 23 Ноября, 2012 - 13:49:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




EuGen, еще раз спасибо. Вопрос можно считать исчерпанным Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB