Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > 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,615
Репутация: 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,107
Репутация: 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,107
Репутация: 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,615
Репутация: 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,615
Репутация: 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


14:06.


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

RusProfile.ru


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