Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最常用的author-mysql规范化数据库标记_Php_Mysql_Sql - Fatal编程技术网

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(*)
)。干杯谢谢你的帮助。使用溶液