我正在使用MySQL创建文章和类别的数据库。每篇文章都有一个类别。我想为管理面板制作一个列出所有类别的功能,但也包含每个类别的最新文章。我通常使用的方法是从类别表中获取行,循环遍历结果,然后使用类似FROM articles
创建另一个查询WHERE category_id = {CATEGORY_ID} ORDER BY article_id DESC LIMIT 1.该方法对我来说似乎过度我想知道是否可以在一个查询中完成(也许有连接和子查询?)。我该如何避免为此使用两个单独的查询?
这是当前查询我有一个获取类:
SELECT * FROM article_categories ORDER BY category_title ASC
这些都是我的表:
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,
`type` tinyint(1) 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,
`youtube_id` varchar(32) DEFAULT NULL,
`refs` text NOT NULL,
`platforms` varchar(6) 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,
`guest_reading` tinyint(1) NOT NULL,
`platform_assoc` tinyint(1) NOT NULL,
`allowed_types` varchar(6) NOT NULL,
PRIMARY KEY (`category_id`,`title`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这是查询我来了这么远:
SELECT
c.category_id, c.title, c.description,
a.article_id, a.category_id, a.title, COUNT(a.article_id) AS total_articles
FROM article_categories AS c
LEFT JOIN articles AS l ON (
SELECT
article_id AS article_id, category_id, title AS article_title
FROM articles AS l
WHERE l.category_id = c.category_id
ORDER BY l.article_id
DESC LIMIT 1)
LEFT JOIN articles AS a ON (c.category_id = a.category_id)
GROUP BY c.category_id
ORDER BY c.title ASC
以上查询给我以下SQL错误:
Operand should contain 1 column(s)
这是怎么回事?
我还需要该类别的最后一篇文章的标题。我会怎么做?如果我将其他字段添加到子查询中的select语句中,则会得到我的原始错误。 – ShoeLace1291 2014-09-23 01:25:48