Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2018, 15:49   #1
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию Insert с подзапросом select if

Хочу вставить строку, но перед этим проверить, есть ли похожее значение в таблице. Если есть, то в новую строку записываю id той строки в которой нашлось совпадение, если нет похожей записи, то записываю '0'.

id | code | text

Есть два отдельных запроса, которые работают, но вместе работать не хотят ((

Получить id строки в которой code=1234, если нет, то вывести '0'.
Код:
SELECT IF (
    (SELECT `id` FROM `user` WHERE `code`='1234') > 0,
    (SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1),
    0 )
FROM `user`
WHERE `code`='1234'
Вставка новой строки.
Код:
INSERT INTO `user`(`text`, `code`) VALUES ('texttext', '1234')
Если их объединить, то выдает синтаксическую ошибку: "Table 'user' is specified twice, both as a target for 'INSERT' and as a separate source for data"
Код:
INSERT INTO `user`(`text`, `code`) VALUES ('texttext', (
    SELECT IF (
        (SELECT `id` FROM `user` WHERE `code`='1234') > 0,
        (SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1),
        0 )
    FROM `user`
    WHERE `code`='1234')
)
Подскажите, как можно видоизменить запрос?
СУБД: MySQL

Последний раз редактировалось Parallelogram; 26.06.2018 в 16:12.
Parallelogram вне форума Ответить с цитированием
Старый 26.06.2018, 15:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

СУБД какая?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.06.2018, 15:58   #3
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
СУБД какая?
Mysql
Parallelogram вне форума Ответить с цитированием
Старый 26.06.2018, 16:14   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Формат INSERT ... SELECT подойдет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.06.2018, 16:34   #5
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Формат INSERT ... SELECT подойдет
Так? Если нет совпадений, то запись не произойдет.
Ну или я не понимаю в этом совсем ничего.
Код:
INSERT INTO `user` (`code`, `text`) 
SELECT IF ( (SELECT `id` FROM `user` WHERE `code`='1234') > 0, (SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1), 0 ), 'texttext'
FROM `user`
WHERE `code`='1234'
Parallelogram вне форума Ответить с цитированием
Старый 26.06.2018, 16:47   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

from убери
Код:
INSERT INTO `user` (`code`, `text`) 
SELECT IF ( (SELECT `id` FROM `user` WHERE `code`='1234') > 0, (SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1), 0 ), 'texttext'
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.06.2018, 16:55   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
INSERT INTO `user` (`code`, `text`) 
SELECT IF ( (SELECT `id` FROM `user` WHERE `code`='1234') > 0, (SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1), 0 ), 'texttext'
Работает!

а можно ещё и так:
Код:
INSERT INTO `user` (`code`, `text`) 
SELECT COALESCE((SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1), 0 ), 'texttext'
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.06.2018, 16:58   #8
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
from убери
Спасибо, работает.
Как я понял, для данной конструкции, если убрать FROM WHERE, то SELECT будет искать в той же таблице, в какую вставляет.
Parallelogram вне форума Ответить с цитированием
Старый 26.06.2018, 16:59   #9
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Работает!

а можно ещё и так:
Код:
INSERT INTO `user` (`code`, `text`) 
SELECT COALESCE((SELECT `id` FROM `user` WHERE `code`='1234' ORDER BY id DESC LIMIT 1), 0 ), 'texttext'
А какой из вариантов лучше? Кроме как второй короче.
Parallelogram вне форума Ответить с цитированием
Старый 26.06.2018, 17:06   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Parallelogram Посмотреть сообщение
Как я понял, для данной конструкции, если убрать FROM WHERE, то SELECT будет искать в той же таблице, в какую вставляет.
Вы неправильно поняли.

ваш select без from берёт данные без привязки к таблице:
попробуйте, например, выполнить запрос:
Код:
select 100, now(), 'Куку'
а там, где вам нужно найти `id` там указывается нужная таблица


Цитата:
Сообщение от Parallelogram Посмотреть сообщение
А какой из вариантов лучше? Кроме как второй короче.
не буду утверждать, но рискну предположить, что вариант с coalesce выполнится чуть эффективней.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
множество select в одном insert ssm116 SQL, базы данных 5 26.09.2017 16:21
Insert + Select = You can't specify target table -Jack- SQL, базы данных 10 02.11.2016 12:57
Написание процедур select, delete, update, insert (с выходным параметром) NatRez SQL, базы данных 4 21.10.2012 19:54
INSERT Value( select) Marina8 Помощь студентам 5 24.04.2012 13:03
Запрос вида Insert..Select MySQL Svap SQL, базы данных 3 11.01.2011 19:11