Вставить несколько значений с разными критериями выбора?

#mysql #sql #insert

#mysql #sql #вставить

Вопрос:

Существует ли метод для вставки нескольких значений, когда каждое значение должно сначала получить некоторую информацию из другой таблицы?

Например, у меня есть две таблицы

  • интересы = идентификатор,subject1
  • пользовательские интересы = id,userid,interestid

данные для таблиц могут выглядеть следующим образом

интересует пример таблицы

 id  interests
-------------
1   cats  
2   mysql  
3   php  
  

таблица примеров пользовательских интересов

 id  user   interest_id
----------------------
1   dan    1            -- dan is interested in cats  
2   johan  2            -- johan is interested in mysql   
3   joe    1            -- joe is interested in cats  
  

Я узнаю, что новый пользователь Хейли интересуется American Idol и бородами

интересует пример таблицы

 id  interests
-------------
1   cats  
2   mysql  
3   php  
4   American Idol  
5   beards  
  

Затем я хочу обновить базу данных userInterest, чтобы добавить

 id  user     interest_id
------------------------
4   hayley   4          -- hayley is interested in American Idol  
5   hayley   5          -- hayley is interested in beards 
  

но я не могу, потому что я не знаю, какие идентификаторы интереса для American Idol и beards?

Я хочу вставить все интересы Хейли сразу в какой-то запрос с несколькими вставками.

 INSERT into userInterests   
  Values(hayley, --whatever the id from table interests for "American Idol")  
  Values(hayley, --whatever the id from table interests for "beards")
  

Я предполагаю, что я бы использовал SELECT где-нибудь, но не уверен, где. Может ли кто-нибудь привести мне пример того, как это сделать?

Ответ №1:

Использовать:

 INSERT INTO userInterests 
SELECT DEFAULT, 'hayley', i.id
  FROM INTERESTS i
 WHERE i.subject1 IN ('American Idol', 'beards')
  

DEFAULT это потому, что я предполагаю, что id столбец является AUTO_INCREMENT .

Комментарии:

1. Как изменился бы запрос, если бы было 3 объекта вместо 1. Я бы сделал, ГДЕ i.subject1 В (‘American Idol’, ‘Beards’) И i.subject2 В (‘American Idol’, ‘Beards’)…

2. @daniel savage: Это возможно, но настройка базы данных (столбцы) не идеальна.

3. @Elprup, ваше предлагаемое редактирование, вероятно, должно быть новым ответом или комментарием к этому ответу.

Ответ №2:

Что-то вроде этого?

 INSERT INTO userInterests VALUES
(hayley, SELECT id FROM interests WHERE subject1 = "American Idol"), 
(hayley, SELECT id FROM interests WHERE subject1 = "beards"); 
  

Ввод вместо hayley идентификатора Хейли (вы не сказали, какой у него тип, поэтому я не знаю).

Комментарии:

1. Это то, что я искал, но мне интересно, есть ли более краткий способ написать это.

2. я получаю ошибки с предоставленным вами синтаксисом, заменяющим hayley запросом для выбора идентификатора Хейли из таблицы users (id, name), выполнив этот Select id из users, где name =’Хейли’. Я могу запускать каждый запрос select отдельно, но объединение их с помощью insert into …значения (выберите 1, выберите 2), похоже, не работает???

3. @daniel savage: Именно поэтому вы используете синтаксис в предоставленном мной ответе.

4. При выполнении этого SELECT всегда должен возвращать только одно значение, поэтому вы можете выполнить SELECT MAX (id), например, чтобы показать вашей СУБД, что запрос всегда будет возвращать подходящее значение для id.