У меня есть три таблицы:

group:
  id - primary key
  name - varchar

profile:
    id - primary key
    name - varchar
    surname - varchar
    [...etc...]

profile_group:
    profile_id - integer, foreign key to table profile
    group_id - integer, foreign key to table group

Профили могут быть во многих группах. У меня есть группа «Пользователи» с id = 1, и я хочу назначить всех пользователей в эту группу, но только если такой записи для профилей таблиц не было.

Как это сделать?

0
Nips 3 Сен 2014 в 03:01

2 ответа

Лучший ответ

Если я вас правильно понял, вы хотите добавить записи типа ( profile_id , 1) в таблицу profile_group для всех профилей, которых раньше не было в этой таблице. Если да, попробуйте следующее:

INSERT INTO profile_group(profile_id, group_id) 
     SELECT id, 1 FROM profile p 
     LEFT JOIN profile_group pg on (p.id=pg.profile_id) 
     WHERE pg.group_id IS NULL;
1
CupOfWonder 3 Сен 2014 в 00:12

Что вы хотите сделать, так это использовать левое соединение с таблицей группы профилей, а затем исключить любые совпадающие записи (это делается в предложении where приведенного ниже оператора SQL).

Это быстрее, чем использование not in (select xxx), поскольку профилировщик запросов, кажется, справляется с этим лучше (по моему опыту)

insert into profile_group (profile_id, group_id)
select p.id, 1
from profiles p
left join profile_group pg on p.id = pg.profile_id 
    and pg.group_id = 1
where pg.profile_id is null
0
mjallday 2 Сен 2014 в 23:35