MySQL查询简化求助:找出兼具导演与演员身份的人员
一、简化“既是导演又是演员”的查询语句
假设你的数据结构是分表存储(比如movie_actors存演员信息,movie_directors存导演信息,两表共享person_id/person_name这类人员标识字段),以下几种简化方案供你选择:
方案1:用INTERSECT(MySQL 8.0+支持)
这是最直观的写法,直接取两个结果集的交集:
SELECT person_id, person_name FROM movie_actors INTERSECT SELECT person_id, person_name FROM movie_directors;
方案2:用IN子查询(兼容低版本MySQL)
如果你的MySQL版本不支持INTERSECT,子查询写法足够简洁:
SELECT person_id, person_name FROM movie_actors WHERE person_id IN (SELECT person_id FROM movie_directors);
方案3:用内连接关联查询
适合需要同时关联更多字段的场景,记得加DISTINCT避免重复结果:
SELECT DISTINCT a.person_id, a.person_name FROM movie_actors a JOIN movie_directors d ON a.person_id = d.person_id;
二、CSV导入时将空白单元格转为NULL
不用再靠CHAR_LENGTH过滤,直接在导入环节或后续批量修正处理:
1. 导入时用LOAD DATA INFILE直接转换
通过用户变量接收CSV值,再用NULLIF函数把空白转NULL:
LOAD DATA INFILE '/path/to/your/movies.csv' INTO TABLE movies FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS -- 跳过表头行 (col1, col2, @director, @actor, col5) SET director = NULLIF(TRIM(@director), ''), actor = NULLIF(TRIM(@actor), '');
TRIM是为了处理CSV里的空白(比如多个空格),确保所有无意义的空白都能转为NULL。
2. 已导入数据的批量修正
如果已经把空白字符串导入数据库了,执行批量更新即可:
UPDATE movies SET director = NULL WHERE TRIM(director) = ''; UPDATE movies SET actor = NULL WHERE TRIM(actor) = '';
3. 预处理CSV文件(Excel/OpenOffice)
导入前在Excel里批量处理:选中空白单元格,直接替换为NULL;或者用公式=IF(A1="", "NULL", A1)生成新值后复制回原列,再导出CSV。
内容的提问来源于stack exchange,提问作者jordan_butler_33
相关产品推荐
相关产品推荐

