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(*)"时也不确定如何更改它.
而不是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)