| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > существует ли значение |
| Автор: Zorak 3.3.2013, 15:37 |
| Всем здраствуйте. Стокнулся с проблемой. Можно ли как то проверить существует ли значение в таблице? З.Ы. Программирую на ПХП. Детали: Есть таблица1 с полем uid. Я составляю запрос типа UPDATE ... WHERE uid == 1; Можно ли составить такой запрос исключительно sql: ЕСЛИ существует поле uid == 1 ТОГДА sql = UPDATE ... ИНАЧЕ ЕСЛИ uid со значением == 1 не существует тогда INSERT INTO ... Спасибо)... Надежда умирает последней -=) |
| Автор: Arantir 3.3.2013, 16:04 |
| REPLACE и ON DUPLICATE KEY UPDATE вам в помощь. Синтаксис REPLACE точно такой же, как у INSERT, но при существовании ключа указанные поля будут обновлены и не будет выброшено ошибки. ON DUPLICATE KEY UPDATE ставится после запроса INSERT и указывает на то, что следует сделать, если ключ существует. После слова UPDATE пишется запрос с обычным синтаксисом UPDATE-а. |
| Автор: Zorak 3.3.2013, 16:07 |
| Понял, спасибо большое... ушол разбиратся. будут вопросы еще напишу, спасибо огромное еще раз! |
| Автор: Zorak 8.3.2013, 18:13 | ||
| Да получилось, но родился дополнительнй вопрос. А можно ето дело применить НЕ к уникальному ключу.. а например к полю типа text?. Т.е. Есть значения в базе данных: 1. Так рботает отлично!: user_id (unique key) | type 1 | 1 2 | 1 3 ...... 2. А можно ли применить такоеже но примерно так: user_id (not unique key) | type 1 | 1 1 | 2 3 ...... Т.е. в запросе ON DUPLICATE KEY в конце добавить WHERE, тоесть где именно обновлять... Другими словами эти Дупликате кей у меня целых два: user_id и type... Т.е. при трех одинаковых значениях user_id есть три разных type, ну и в конце концов последнее т.е. запрос должен быть типа:
Вот ето вот AND уменя никак не получается... Когда добавляю в конце WHERE выдае ошибку -=).. Спасибо! |
| Автор: Arantir 8.3.2013, 19:38 | ||||
Ну, вообще-то, в ключе может содержаться несколько полей. Если то, что ключевых поля 2, — это свойство самой сущности, представляемой таблицей, то лучше просто измените ключ.
Таким образом таблица по природе своей не сможет содержать 2 поля с одинаковой парой user_id-type. Добавлено через 4 минуты и 27 секунд
|
| Автор: Zorak 8.3.2013, 20:28 |
| Ну да, кавычки да, есть, просто писал сразу в браузер код по памяти, посиму их и пропустил.. И так... Скажу суть проблемы и как я ее хочу решить, вы поймете откуда у меня возник вопрос. В итоге может я не правильно думаю и вы посоветуете более гуманный метод решения проблемы. И так: 1. Есть игра: "ИГРА!" 2. При регистрации пользователя ему призначается id_user (например 1). 3. Есть три уровня сложности (например 11,22,33) 4. Игра быстрая и очень многоразовая, к тому же игрок каждый раз может выбрать уровень сложности и результат после окончания игры у меня запихивается у базу данных для дальнейшего вывода так сказать топ листа, Но результаты должны делится по уровню сложности. И так, отсуда и проблема.. мне надо в таблицу вписать ТРИ результата (по результату на разный уровень сложности - level) на ОДИН id_user. ИтОгО. При первом вхождении в игру с определенным уровнем надо чтобы был запрос INSERT, если это не первый раз, тогда UPDATE. Отсюда у меня и берется проблема с id_user и level... Какбы два ключевых поля, по которым определяется запрос) З.Ы. Если не понятно пишите, обьясню более доступно. |
| Автор: Arantir 8.3.2013, 21:35 |
| Ну так для таблицы результатов и делайте ключ с двумя полями, как я описал немного выше. Это вполне обычная практика. ON DUPLICATE KEY берет во внимание все поля в ключе. То есть, в таблице может быть сколько угодно повторений user_id и level, но у одного юзера не может быть больше одной записи с одним и тем же уровнем. Например, у вас есть запись вида (user:1,level:low,:points:289) и вы хотите добавить 10 очков юзеру 1 на уровень low, то сработает ON DUPLICATE KEY, где вы, например, пишите UPDATE SET points += $value. И в итоге получите запись (user:1,level:low,:points:299). Если же вы добавите юзеру 1 очки на уровень high, а такого уровня у этого юзера еще нет, то сработает основной запрос и будет создана новая запись (user:1,level:high,:points:10), которая при последующих запросах будет обновляться. |
| Автор: Zorak 8.3.2013, 21:47 |
| Да, получилось, вроде как бы нормально все работает, спасибо большое).. будут изьяны буду писать -=) |