gpt4 book ai didi

mysql - 我如何避免为此目的使用两个单独的查询?

转载 作者:行者123 更新时间:2023-11-29 12:42:05 25 4
gpt4 key购买 nike

我正在使用 MySQL 创建文章和类别的数据库。每篇文章都有一个类别。我想为管理面板创建一个功能,列出所有类别,但还包括每个类别的最新文章。我通常使用的方法是从类别表中获取行,循环遍历结果,然后使用类似 FROMarticlesWHEREcategory_id = {CATEGORY_ID} ORDER BYarticle_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 C.*, A.*
FROM article_categories C
LEFT OUTER JOIN articles A ON c.category_id = A.category_id
WHERE
(
A.category_id IS NULL OR
A.article_id = (SELECT MAX(X.article_id)
FROM articles X WHERE X.category_id = C.category_id)
)

关于mysql - 我如何避免为此目的使用两个单独的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com