You can use the following query to get the result:
select a.art_id, a.name from articles a inner join article_tags at on a.art_id = at.art_id inner join tags t on at.tag_id = t.tag_id where t.description in ('Short', 'Scientific')
See SQL Fiddle with Demo
Or it could be written:
select a.art_id, a.name from articles a inner join article_tags at on a.art_id = at.art_id inner join tags t on at.tag_id = t.tag_id group by a.art_id, a.name having sum(case when t.description = 'Short' then 1 else 0 end) >= 1 and sum(case when t.description = 'Scientific' then 1 else 0 end) >= ;
See SQL Fiddle with Demo .
If you just want to return the article id, you can simply query the article_tag table:
select art_id from article_tags where tag_id in (1, 3) group by art_id having count(distinct tag_id) = 2
See SQL Fiddle with Demo
Taryn source share