最常用的作者标签 - mysql规范化数据库

时间:2011-03-31 01:05:06

标签: php mysql sql

我无法让这个查询起作用。我尝试了这个,但不起作用:

SELECT tags.*
FROM blog_tags AS tags 
LEFT JOIN blog_items AS items ON (items.authorid = 4) 
LEFT OUTER JOIN blog_items_tags AS itemstags ON (itemstags.itemid = items.id) 
GROUP BY tags.id

我想要的是获取作者在文章中使用的所有标签。

对于这个想法:数据库是:

  • blog_tags(id,title)
  • blog_items(只是带有字段ID,作者等的文章......)
  • blog_items_tags(itemid,tagid)。

什么是正确的陈述? (我对mysql不是很熟悉)

3 个答案:

答案 0 :(得分:2)

我总是在这种情况下使用子查询。你也可以使用连接,但是我从来没有像写那些那样舒服(而且我认为他们无论如何都会评估相同的数据库查找 - 但如果我错了就纠正我!),所以我会写这样的东西:

SELECT tags.* FROM tags WHERE id IN (
    SELECT tagid FROM blog_items_tags WHERE itemid IN (
        SELECT id FROM blog_items WHERE authorid = 4
    )
);

它比连接更麻烦,但当我回去阅读它时,对我来说更有意义 - 希望这有帮助!

修改:如果您想要使用每个代码的次数,可以在查询中添加COUNTGROUP BY

SELECT tags.*, COUNT(*) FROM tags WHERE id IN (
    SELECT tagid FROM blog_items_tags WHERE itemid IN (
        SELECT id FROM blog_items WHERE authorid = 4
    )
) GROUP BY tags.title;

答案 1 :(得分:1)

通过运行此查询的更简单版本进行故障排除,然后进行构建。从

开始
SELECT tagid FROM blog_tags

然后开始工作。

特别是,尝试删除AS。 SQL的这种风格可能要求它不存在:

SELECT tagid FROM blog_tags tags

答案 2 :(得分:1)

您缺少连接条件(您的blog_tags表未在任何地方使用)。此外,您只需要INNER JOIN,因为您只需要使用的代码,而不是所有代码和相关信息。

以下是更正的查询:

SELECT tags.*
FROM blog_tags AS tags 
INNER JOIN blog_items_tags AS itemstags ON (itemstags.tagid = tags.id) 
INNER JOIN blog_items AS items ON items.authorid = 4 AND items.id = itemtags.itemid 
GROUP BY tags.id