MySQL技术问询:右连接pep与zusammen表无法获取pep属性且需无NULL值
问题分析与解决方案
让我们一步步拆解你的问题,找到对应的解决办法:
1. 为什么无法获取pep表的属性?
你用了RIGHT JOIN,这个连接类型的逻辑是保留右表(zusammen)的所有行,左表(pep)只返回匹配连接条件的行——如果zusammen里的_id_fk在pep的id中找不到对应值,pep的所有列都会返回NULL。
虽然你说两个表都非空,但可能存在以下情况导致pep列全为NULL:
zusammen._id_fk和pep.id的数据类型不匹配(比如一个是INT,一个是VARCHAR),导致匹配失败;- 两张表的实际数据中,没有任何
_id_fk等于id的记录; - 你的查询工具默认隐藏了全为
NULL的列,看起来像是没返回pep的属性。
你可以先执行这条语句验证匹配关系:
-- 检查两个表是否有符合连接条件的记录 SELECT COUNT(*) FROM pep JOIN zusammen ON zusammen._id_fk = pep.id;
如果结果为0,说明确实没有匹配数据,需要排查数据类型或数据内容的问题。
2. 为什么只返回zusammen表的最后5列?
大概率是上面提到的pep列全为NULL,导致你的查询客户端(比如Navicat、phpMyAdmin等)自动隐藏了这些全空列。你可以尝试明确指定要查询的列,而不是用SELECT *,比如:
SELECT pep.*, zusammen.* FROM pep RIGHT JOIN zusammen ON zusammen._id_fk = pep.id WHERE MATCH(zusammen.concat_Names) AGAINST('suche' IN BOOLEAN MODE) LIMIT 50;
这样就能强制显示pep的所有列,不管是否为NULL。
另外注意:AGAINST里的搜索词suche需要用单引号括起来,否则会被MySQL当成列名,引发语法错误。
3. 实现“两表连接无NULL值”的需求
RIGHT JOIN本身会保留右表的所有行,必然会存在pep列为NULL的情况(当没有匹配时)。如果要完全避免NULL,你需要改用**INNER JOIN**——它只返回两张表中符合连接条件的行,自然不会有NULL值:
SELECT pep.*, zusammen.* FROM pep INNER JOIN zusammen ON zusammen._id_fk = pep.id WHERE MATCH(zusammen.concat_Names) AGAINST('suche' IN BOOLEAN MODE) LIMIT 50;
如果你的业务逻辑必须保留zusammen的所有行,但只过滤掉pep为NULL的记录,也可以用RIGHT JOIN加过滤条件,但效果和INNER JOIN完全一致:
SELECT pep.*, zusammen.* FROM pep RIGHT JOIN zusammen ON zusammen._id_fk = pep.id WHERE MATCH(zusammen.concat_Names) AGAINST('suche' IN BOOLEAN MODE) AND pep.id IS NOT NULL LIMIT 50;
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

