Swift数据库查询:如何从所有子类别中获取全部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
相关产品推荐
相关产品推荐

