@SoloMidPlzD

SQL SELECT article by tags?

Есть такая схема:
articles (id, name)
tags (id, name)
article_tags (article_id, tag_id)

Для того чтобы выбрать articles, которые имеют хотябы 1 tag из перечиня (допустим с tag_id 1,2,3, 4)
я втупую делал 2 query: SELECT article_id WHERE tag_id in (1,2,3,4)
и потом тоже самое с article: SELECT * WHERE id in (1,2,3,4)
Ето вообщем правильно работало.

Но мне теперь еще нужно фильтр articles, что не имеют тега. Я пробывал также втупую делать (выбрал два масива article ids - то чно нужно и не нужно + array_differ и потом полные articles выбирал, но оно работает не правильно :( . Выбирает иногда то что не нужно.

Помогоите кто гуру SQL

UPDATE: все норм, я немного тупанул. Preapared statement для WHERE IN, не работает. Нужно сначало фильтрануть масив tag_id чемто типа
tag_ids = array_filter($tag_ids, 'ctype_digit');
и потом кидать сразу в SQL implode(',', $tag_ids);

и с етим лаже мой метод будет работать, хотя уже использую решенний ответ
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
EreminD
@EreminD
Кое-что умею
SELECT * FROM articles WHERE id NOT IN (SELECT article_id FROM article_tags)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@dmitryKovalskiy
программист средней руки
SELECT what your need FROM articles as a
LEFT JOIN article_tags as at ON a.id = at.article_id
WHERE at.tag_id is NULL
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Но мне теперь еще нужно фильтр articles, что не имеют тега.

SELECT articles.ID, articles.Name
  FROM articles LEFT OUTER JOIN  article_tags ON articles.ID = article_tags.article_id
  WHERE (article_tags.tag_id IS NULL)

tag из перечиня
Создаём таблицу этого перечня.
CREATE TABLE [dbo].[tag_list](
	[ID] [int] NULL,
	[tag_id] [int] NULL
) ON [PRIMARY]

И получаем нужный набор:
SELECT DISTINCT articles.ID, articles.Name
  FROM articles INNER JOIN article_tags ON articles.ID = article_tags.article_id 
                         INNER JOIN tag_list ON article_tags.tag_id = tag_list.tag_id
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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