@TTDrMoroTT

Как соединить две таблицы со значение столбца по условию без дублирования строк?

Привет! Имеются 2 таблицы: tags(id,title,description,create_date) содержащую информацию о тегах и таблица posts_tags(id,tag_id, post_id) с информацией какие теги у каких постов. Нужно получить таблицу в которой должны быть следующие столбцы:
tags.id, tags.title, tags.description и 4 столбец have_tag содержащий 1 или 0 в зависимости от того есть ли у поста тег с таким id.
Мой запрос: SELECT DISTINCT tags.id, tags.title, tags.description, IF((posts_tags.post_id=33),1,0) AS have_tag FROM tags LEFT JOIN posts_tags ON posts_tags.tag_id=tags.id ORDER BY tags.id ASC
даёт не то что мне надо.
62093ff4b4400589074181.png

Тег с id 3 единственный имеющийся у поста 33 появляется дважды со значениями 1 и 2. Соответственно если в запросе указать пост 32 то дублируются теги 1 и 3 которые у него есть.
Каким образом можно правильно составить запрос при котором получится таблица из 4 строк без со значениями have_tag 1 или 0 дублирования? SQL начал изучать относительно недавно поэтому не уверен в как именно нужно составлять данный запрос.
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Потому что тег ID=3 принадлежит не только посту 33. Вот и получаете что есть запись в которой он принадлежит и запись в которой не принадлежит. А если будет 3 поста - будет 3 такие записи (в одной принадлежит и в двух не принадлежит) и т.д.

У меня такой вопрос: зачем вам список тегов, которые не принадлежат посту? Обычно интересуют именно те, которые принадлежат. И обязательно ли это делать одним запросом?

Получить список тегов, которые принадлежат посту:
SELECT t.* FROM tags t 
JOIN posts_tags pt ON pt.tag_id=t.id
WHERE pt.post_id=:post_id

Получить список тегов, которые не принадлежат посту:
SELECT t.* FROM tags t 
LEFT JOIN posts_tags pt ON pt.tag_id=t.id AND pt.post_id=:post_id
WHERE pt.id IS NULL

Если хочется завернуть это в один запрос - добавляете колонку have_tag (в первом запросе - 1, во втором - 0) и делаете UNION.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы