You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift数据库查询:如何从所有子类别中获取全部author数据?

如何从所有子类别中获取全部"author"?

首先,我猜你的数据库是按内容类型拆分了不同的表(比如books、movies、series这类),每个表都包含author字段对吧?结合你说后续还会新增类别,给你几个不同场景的解决方案:

1. 快速实现:用UNION ALL拼接查询

如果暂时不想改数据库结构,最简单的方式就是用UNION ALL把各个子表的author字段合并起来:

SELECT author FROM books
UNION ALL
SELECT author FROM movies
UNION ALL
SELECT author FROM series
  • 要是你需要去重后的作者列表,把UNION ALL换成UNION就行(不过UNION会做去重,性能比UNION ALL稍差);
  • 后续新增类别时,只要在后面继续加UNION ALL SELECT author FROM 新表名就行。

2. 自动化适配新增表:用动态SQL存储过程

如果后续会频繁加新表,每次改SQL太麻烦,可以写一个存储过程自动遍历符合条件的表,生成动态查询:
(以MySQL为例,其他数据库语法略有不同,但思路一致)

DELIMITER //
CREATE PROCEDURE GetAllAuthors()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE table_name VARCHAR(255);
    -- 这里可以根据你的表命名规则调整WHERE条件,比如匹配所有以'content_'开头的表
    DECLARE cur CURSOR FOR 
        SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = DATABASE() 
        AND table_name IN ('books', 'movies', 'series');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET @sql = '';

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO table_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        IF @sql = '' THEN
            SET @sql = CONCAT('SELECT author FROM ', table_name);
        ELSE
            SET @sql = CONCAT(@sql, ' UNION ALL SELECT author FROM ', table_name);
        END IF;
    END LOOP;
    CLOSE cur;

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

之后只要调用CALL GetAllAuthors();就能自动获取所有符合条件表的author,新增表只要符合information_schema里的筛选规则,不用修改存储过程。

3. 长期最优解:优化数据库结构

从可维护性角度来说,如果你后续会不断新增类别,不建议按类别分表,最好改成单表+类型字段的结构:
比如建一张content表,包含字段:id、type(存储'book'/'movie'/'series'等类型)、author、其他内容字段...
这样查询所有作者就非常简单:

SELECT author FROM content;

后续新增类别只需要在type字段里新增枚举值,不用建新表,无论是查询还是维护都更高效。

内容的提问来源于stack exchange,提问作者Andrew0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:25