Php 最常用的author-mysql规范化数据库标记
我无法让这个查询工作。我试过这个,但不起作用:Php 最常用的author-mysql规范化数据库标记,php,mysql,sql,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 我想要的是获得作者在文章中使用的所有标签 对于idea:数据库是: 博
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
我想要的是获得作者在文章中使用的所有标签
对于idea:数据库是:
- 博客标签(id、标题)
- 博客项目(仅包含字段id、作者等的文章)
- blog_items_标记(itemid,tagid)
正确的说法是什么?(我对mysql不太熟悉)通过运行此查询的更简单版本,然后进行构建来排除故障。从
SELECT tagid FROM blog_tags
那就开始吧
特别是,请尝试删除AS。这种风格的SQL可能要求它不存在:
SELECT tagid FROM blog_tags tags
通过运行此查询的更简单版本进行故障排除,然后构建。从
SELECT tagid FROM blog_tags
那就开始吧
特别是,请尝试删除AS。这种风格的SQL可能要求它不存在:
SELECT tagid FROM blog_tags tags
我总是在这种情况下使用子查询。您也可以使用连接,但我从来没有像这样轻松地编写这些连接(我认为它们的计算结果都是相同的DB查找-但如果我错了,请纠正我!),因此我会这样编写:
SELECT tags.* FROM tags WHERE id IN (
SELECT tagid FROM blog_items_tags WHERE itemid IN (
SELECT id FROM blog_items WHERE authorid = 4
)
);
这比加入有点混乱,但当我回去阅读它时,它对我更有意义-希望这有帮助
编辑:如果需要每个标记的使用次数,可以在查询中添加计数和分组依据:
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;
我总是在这种情况下使用子查询。您也可以使用连接,但我从来没有像这样轻松地编写这些连接(我认为它们的计算结果都是相同的DB查找-但如果我错了,请纠正我!),因此我会这样编写:
SELECT tags.* FROM tags WHERE id IN (
SELECT tagid FROM blog_items_tags WHERE itemid IN (
SELECT id FROM blog_items WHERE authorid = 4
)
);
这比加入有点混乱,但当我回去阅读它时,它对我更有意义-希望这有帮助
编辑:如果需要每个标记的使用次数,可以在查询中添加计数和分组依据:
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;
缺少联接条件(您的blog_tags表未在任何地方使用)。此外,您需要一个内部联接
,因为您只需要使用的标记,而不是所有标记和相关信息
以下是更正的查询:
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
缺少联接条件(您的blog_tags表未在任何地方使用)。此外,您需要一个内部联接
,因为您只需要使用的标记,而不是所有标记和相关信息
以下是更正的查询:
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
你有错误消息吗?没有,mysql只是一直在处理这个。其他的错误有:#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解使用第4行“内部连接博客\u items\u标记AS itemstags ON(itemstags.itemid=items.id)”的正确语法。请描述您是如何运行查询的——PHP页面?查询管理程序?phpMyAdmin?你有错误消息吗?没有,mysql只是一直在处理这个。其他的错误有:#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解使用第4行“内部连接博客\u items\u标记AS itemstags ON(itemstags.itemid=items.id)”的正确语法。请描述您是如何运行查询的——PHP页面?查询管理程序?phpMyAdmin?是的,但是大多数时候我没有得到错误,我只是把所有的标签都拿回来,而不是只拿作者的标签。查询没有完成它的工作。还没弄明白。啊。这是您的帖子所必需的信息。建议您让查询显示除标记外的其他表中的字段,以便查看发生了什么。我希望你能通过尝试变体来解决这个问题。谢谢!让它发挥作用。问题在于连接。无论如何,谢谢你的提示!是的,但是大多数时候我没有得到一个错误,我只是得到了所有的标签,而不仅仅是作者的标签。查询没有完成它的工作。还没弄明白。啊。这是您的帖子所必需的信息。建议您让查询显示除标记外的其他表中的字段,以便查看发生了什么。我希望你能通过尝试变体来解决这个问题。谢谢!让它发挥作用。问题在于连接。无论如何,谢谢你的提示!他,谢谢。试过了,效果很好。但尽管我不熟悉这个符号;使用联接的正确方法是什么?(我也想计算作者使用标记的次数,并将其添加到查询中;这里看不出是如何完成的)在对大型数据库使用子查询时-确保mysql服务器正确使用索引(使用EXPLAIN运行查询)。有bug报告称,由于未使用索引,这种方法速度较慢,建议对这些类型的应用程序使用联接。@Serge-Cool-感谢提供的信息。我以后会注意的。干杯@伯特-我在我的答案中添加了一个计数版本。如果你想知道如何使用连接,请查看Serge的答案(我想你也可以在他的答案中添加一个COUNT(*)
)。干杯谢谢你的帮助。使用哔叽胶;最后一个问题是对他的回答的评论。您的解决方案也很有效,但我更喜欢连接,而且它看起来更快(但我可能对此误解)。无论如何谢谢你!他,谢谢。试过了,效果很好。但尽管我不熟悉这个符号;使用联接的正确方法是什么?(我也想计算作者使用标记的次数,并将其添加到查询中;这里看不出是如何完成的)在对大型数据库使用子查询时-确保mysql服务器正确使用索引(使用EXPLAIN运行查询)。有bug报告称,由于未使用索引,这种方法速度较慢,建议对这些类型的应用程序使用联接。@Serge-Cool-感谢提供的信息。我以后会注意的。干杯@伯特-我在我的答案中添加了一个计数版本。如果你想知道如何使用连接,请查看Serge的答案(我想你也可以在他的答案中添加一个COUNT(*)
)。干杯谢谢你的帮助。使用溶液