MySQL同列值比较与跨表查询问题:SQL结果不符合预期
修复你的MySQL查询问题
首先我先理清楚你的两张表结构和数据,确保理解正确:
- ok1表:包含
id,model,name字段,数据为(1, 'AAA', 'AAA')、(2, 'BBB', 'BBB')、(3, 'CCC', 'CCC') - ok2表:包含
idok,nameok字段,数据为(1, 'ok1')、(2, 'ok2')、(3, 'ok3')
你的原SQL存在几个关键问题,导致无法得到预期结果:
- 错误使用了占位符表名
yourTable,实际应该替换为你的真实表名ok1和ok2 - 重复使用
t1别名造成冲突(最后一行的inner join yourTable t1),不同表/关联需要用不同别名区分 - 关联逻辑混乱,没有正确把
ok2表和ok1的主表、自连接表关联起来 - 字段别名不符合你需要的结果集要求(比如用了
nameok1/nameok2,而你需要nameok/okname)
根据你要的结果集字段(id, name, model, nameok, idmodel, namemodel, modelmodel, okname),我推测你想要的逻辑是:
- 从
ok1主表获取基础字段 - 从
ok1自连接的其他记录获取关联字段(要求主表和自连接表的name、model不重复) - 从
ok2表分别关联主表、自连接表的id,得到对应的nameok和okname
下面是修复后的SQL语句:
SELECT t1.id, t1.name, t1.model, ok2_main.nameok, t2.id AS idmodel, t2.name AS namemodel, t2.model AS modelmodel, ok2_rel.nameok AS okname FROM ok1 t1 -- 自连接ok1,排除name和model相同的记录 INNER JOIN ok1 t2 ON t1.name <> t2.name AND t1.model <> t2.model -- 关联ok2获取主表对应的nameok INNER JOIN ok2 ok2_main ON t1.id = ok2_main.idok -- 关联ok2获取自连接表对应的okname INNER JOIN ok2 ok2_rel ON t2.id = ok2_rel.idok;
执行这条SQL后,你会得到符合字段要求的结果集,举部分示例:
| id | name | model | nameok | idmodel | namemodel | modelmodel | okname |
|---|---|---|---|---|---|---|---|
| 1 | AAA | AAA | ok1 | 2 | BBB | BBB | ok2 |
| 1 | AAA | AAA | ok1 | 3 | CCC | CCC | ok3 |
| 2 | BBB | BBB | ok2 | 1 | AAA | AAA | ok1 |
如果这个结果和你的预期有偏差,可以补充说明具体的数据逻辑,我再帮你调整~
内容的提问来源于stack exchange,提问作者Sri Karyani Damanik
相关产品推荐
相关产品推荐

