Items and their tags
As I hinted in my first comment, you have to move the join in the subquery, so you still have only one row of output per item. Example can be tested at http://sqlfiddle.com/#!9/11b37/3

SELECT items.*,
  (SELECT GROUP_CONCAT(tags.tag)
   FROM tags
   JOIN tags_items ON tags_items.tag_id = tags.id
   WHERE items.id = tags_items.item_id) AS tags
FROM items
WHERE items.user_id = 0;


Using 3 tables is the right design. With only two you would end up with multiple rows for the same tag name.

Your original tables have redundant user_id column in tags table (and that same would apply for tags_items) - as one tag/tags_items row can only be linked with one item the user_id is defined by it.