Sho*_*291 10 mysql select join
我正在开发一个使用类别和子类别的文章系统.
基本上,如果类别具有parent_id
值,则它是该类别的子级.
我希望能够从其子类别的类别和文章中获取最新文章.
例如:我有一个名为"游戏文章"的类别和一些名为Xbox,PlayStation,Nintendo和PC的子类别.我的系统可以在父类别中发布文章,例如游戏文章以及子类别.
因此,这必须包括父类别或该父类别的子类别中的文章.
CREATE TABLE IF NOT EXISTS `articles` (
`article_id` int(15) NOT NULL AUTO_INCREMENT,
`author_id` int(15) NOT NULL,
`category_id` int(15) NOT NULL,
`modification_id` int(15) NOT NULL,
`title` varchar(125) NOT NULL,
`content` text NOT NULL,
`date_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` tinyint(1) NOT NULL,
`attachment_id` int(15) NOT NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `article_categories` (
`category_id` int(15) NOT NULL AUTO_INCREMENT,
`parent_id` int(15) NOT NULL,
`title` varchar(50) NOT NULL,
`description` text NOT NULL,
`attachment_id` text NOT NULL,
`enable_comments` tinyint(1) NOT NULL,
`enable_ratings` tinyint(1) NOT NULL,
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
到目前为止我的查询......
SELECT article_id, category_id
FROM articles
WHERE category_id = 1
ORDER BY article_id DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
当然,这只能获得该类别下的文章,而不是类别和该类别的子类别.
根据您的表结构,此查询将在假设只有 1 层嵌套的情况下工作(即子级本身没有子级):
SELECT a.*
FROM articles a
JOIN article_categories ac ON a.category_id = ac.category_id
WHERE 1 IN (a.category_id, ac.parent_id)
ORDER BY a.article_id DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
请注意“反向”样式IN
,以整齐地捕获有效的OR
.
如果您的嵌套更深,只需为每个级别添加另一个联接,例如,如果您最多有 4 个级别(比上述查询多 2 个级别):
SELECT a.*
FROM articles a
JOIN article_categories ac1 ON a.category_id = ac1.category_id
LEFT JOIN article_categories ac2 ON ac1.parent_id = ac2.category_id
LEFT JOIN article_categories ac3 ON ac2.parent_id = ac3.category_id
WHERE 1 IN (a.category_id, ac1.parent_id, ac2.parent_id, ac3.parent_id
ORDER BY a.article_id DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,必须使用左连接才能返回上面没有这么多级别的文章。