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

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
1
Не могли бы вы переформулировать вопрос и быть более ясным? У вас есть профили и группы, и вы хотите назначить всех пользователей группе... тогда является ли профиль пользователем?
 – 
Twelfth
3 Сен 2014 в 03:04

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 в 04:12
Проблема с этим ответом заключается в том, что левое соединение не будет ограничиваться только записями profile_group для группы 1, взгляните на другой ответ на этот вопрос, чтобы увидеть правильную реализацию.
 – 
mjallday
3 Сен 2014 в 22:18

Что вы хотите сделать, так это использовать левое соединение с таблицей группы профилей, а затем исключить любые совпадающие записи (это делается в предложении 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 3 Сен 2014 в 03:35