Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 26.06.2018, 16:49   #1
Parallelogram
Форумчанин
 
Регистрация: 18.01.2011
Адрес: Живу по адресу: Parallelogram@list.ru
Сообщений: 144
Репутация: 35
По умолчанию 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 в 17:12.
Parallelogram вне форума   Ответить с цитированием
Старый 26.06.2018, 16:56   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,601
Репутация: 5352
По умолчанию

СУБД какая?
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 26.06.2018, 16:58   #3
Parallelogram
Форумчанин
 
Регистрация: 18.01.2011
Адрес: Живу по адресу: Parallelogram@list.ru
Сообщений: 144
Репутация: 35
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
СУБД какая?
Mysql
Parallelogram вне форума   Ответить с цитированием
Старый 26.06.2018, 17:14   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,070
Репутация: 6385
По умолчанию

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

Цитата:
Сообщение от Аватар Посмотреть сообщение
Формат 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, 17:47   #6
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,070
Репутация: 6385
По умолчанию

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, 17:55   #7
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,601
Репутация: 5352
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:

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, 17:58   #8
Parallelogram
Форумчанин
 
Регистрация: 18.01.2011
Адрес: Живу по адресу: Parallelogram@list.ru
Сообщений: 144
Репутация: 35
По умолчанию

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

Цитата:
Сообщение от 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, 18:06   #10
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,601
Репутация: 5352
По умолчанию

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

ваш select без from берёт данные без привязки к таблице:
попробуйте, например, выполнить запрос:
Код:

select 100, now(), 'Куку'

а там, где вам нужно найти `id` там указывается нужная таблица


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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
множество select в одном insert ssm116 SQL, базы данных 5 26.09.2017 17:21
Insert + Select = You can't specify target table -Jack- SQL, базы данных 10 02.11.2016 13: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 20:11


09:31.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru