如何将嵌入式mysql查询简化为JOIN?

Jay*_*Jay 1 mysql sql performance join

我最近读了一些关于嵌入式mysql查询的性能问题的内容,所以我想知道如何将以下内容更改为"JOIN"(假设性能更好?).

我有两张桌子:

CREATE TABLE IF NOT EXISTS `blog_categories` (
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_name` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
  `category_name_url` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
  `category_status` enum('online','offline') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'offline'
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;


CREATE TABLE IF NOT EXISTS `blog_articles` (
  `article_id` int(11) NOT NULL AUTO_INCREMENT,
  `article_title` tinytext COLLATE utf8_unicode_ci NOT NULL,
  `category_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=26 ;
Run Code Online (Sandbox Code Playgroud)

逻辑基本上是选择具有与之关联的文章的所有类别.blog_articles表中的每一行都包含一个category_name
.这里是我正在使用的查询(检出并正常工作):

$sql = "SELECT category_name
     , category_name_url 
   FROM blog_categories 
   WHERE (
     (SELECT COUNT(*) 
      FROM blog_articles, blog_categories 
      WHERE blog_articles.category_name = blog_categories.category_name
     ) > 0 
     AND blog_categories.category_status = 'online')";
Run Code Online (Sandbox Code Playgroud)

我还是"JOIN"的新手,并且在混音中使用"COUNT(*)"时也不确定如何更改它.

Mit*_*eat 5

而不是COUNT(*) > 0,使用EXISTS

"SELECT category_name, category_name_url FROM blog_categories WHERE EXISTS (" . 
              "(SELECT 1 FROM blog_articles INNER JOIN blog_categories 
                ON blog_articles.category_name = blog_categories.category_name)  AND " . 
              "blog_categories.category_status = 'online'" . 
              ")";
Run Code Online (Sandbox Code Playgroud)

这是旧样式连接语法:

SELECT 1 FROM blog_articles, blog_categories 
WHERE blog_articles.category_name = blog_categories.category_name
Run Code Online (Sandbox Code Playgroud)

这是ANSI的形式:

SELECT 1 
FROM blog_articles
INNER JOIN blog_categories 
    ON blog_articles.category_name = blog_categories.category_name
Run Code Online (Sandbox Code Playgroud)

更新(响应海报评论):此查询可满足您的需求:

"SELECT category_name, category_name_url 
 FROM blog_categories 
 WHERE category_name IN (SELECT DISTINCT category_name FROM blog_articles)
 AND blog_categories.category_status = 'online'"
Run Code Online (Sandbox Code Playgroud)