Связь многие-ко многим в виде отдельной таблицы
Перед каждой опрацией с тегами желательно знать id тех тегов, которые вы собираетесь удалять или добавлять. Если у вас с клиента приходят не id а строки, то узнаем id так:
select id, name from tag where name in ('js', 'css', 'html')
Также нужно вытащить все теги, которые уже привязаны к статье:
select tag_id from article_has_tag where article_id=1234
Пусть, к примеру, будет js = 111 и css = 222.
Как организовать так чтобы тег "js" был удалён если больше нет привязок к нему иначе просто удалить связь со статьёй1?
Вам обязательно удалять неиспользуемый тег? Это конечно можно сделать, но проще оставить его в таблице, авось еще пригодится для следующих статей. В крайнем случае можно сделать отдельную "удалялку мусора" и запускать ее иногда.
Удалять связь со статьей как-то так:
delete from article_has_tag where article_id=1234 and tag_id=111
Как добавить теги "css" и "html" если тег "css" уже существует в БД, а тег "html" абсолютно новый ?
Так как мы уже пытались узнать id тегов, мы можем понять, что если id для тега "html" не нашелся, то он новый. И добавляем его так:
INSERT INTO tag ('html')
И сразу узнаем какой у него id
$id = mysqli_insert_id();
(возможно у вас используется доступ не через mysqli а через PDO или какую-то ORM, но подобные методы есть везде.) Пусть к примеру вернется 333.
Привязываем теги к статье:
insert into article_has_tag (article_id, tag_id) values (1234, 222), (1234, 333)