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
Форумы портала PHP.SU :: Версия для печати :: INSERT при определенном условии
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » INSERT при определенном условии

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

1. Deonis - 23 Ноября, 2012 - 12:44:23 - перейти к сообщению
Доброго времени суток! Не то чтобы проблема, но всё же ... Предположим, что пользователь может добавить только один комментарий к каждой статье. В таблице коментариев `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 не получится, т.к. поля не могут быть уникальными. Пересмотрел мануалы, но толи пропустил, толи действительно нет такого аналога.
2. EuGen - 23 Ноября, 2012 - 12:47:58 - перейти к сообщению
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 выше.
3. Deonis - 23 Ноября, 2012 - 12:56:13 - перейти к сообщению
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. // Эти комбинации(!), а не значения - уникальны
4. EuGen - 23 Ноября, 2012 - 12:57:26 - перейти к сообщению
Deonis пишет:
2. Повторю, что уникальные ключи отпадают, т.к. значения в полях article_id и user_id могут повторяться, НО не может повторяться комбинация значений этих полей, т.е.

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

- в чем трудность создать индекс по двум полям(ровно это и имелось ввиду) сразу?
Deonis пишет:
Нам не нужно обновлять, а добавлять запись или нет при определенном условии.
EuGen пишет:
- или INSERT IGNORE (в зависимости от желаемого результата)
5. caballero - 23 Ноября, 2012 - 13:01:58 - перейти к сообщению
а что старый добрый if else уже не катит? Не те понты писать такие примитивные конструкции?
6. Deonis - 23 Ноября, 2012 - 13:26:59 - перейти к сообщению
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 таким не сталкивался, поэтому поправьте, если не так. И, если можно, то каким запросом можно объединить ключи, если таблица уже создана?
7. EuGen - 23 Ноября, 2012 - 13:34:49 - перейти к сообщению
Поправлю (остальные поля, разумеется, тоже нужно добавить):
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`));

- да, так создастся ключ по двум полям. И уникальность будет проверяться уже у конкретной пары значений, а не у значения одного поля.
8. Deonis - 23 Ноября, 2012 - 13:46:06 - перейти к сообщению
EuGen, спасибо за помощь. И не подскажите по поводу того, как запросом можно создать индекс по этим полям? Или это можно сделать только при создании таблицы?
9. EuGen - 23 Ноября, 2012 - 13:47:23 - перейти к сообщению
Можно, конечно:
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE comments ADD UNIQUE KEY `some_key` (`article_id`, `user_id`);
10. Deonis - 23 Ноября, 2012 - 13:49:47 - перейти к сообщению
EuGen, еще раз спасибо. Вопрос можно считать исчерпанным Улыбка

 

Powered by ExBB FM 1.0 RC1