MYSQL多表查询问题,left join的使用问题求教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL多表查询问题,left join的使用问题求教相关的知识,希望对你有一定的参考价值。

楼上两个的回答太无语了...
null是不能使用等于号判定的,把where table2.id = null变成where table2.id IS NULL

对于null值mysql中需要使用IS NULL或者IS NOT NULL判断,而不是=和!=追问

还是出不来数据!麻烦您测试一下。

追答

没什么问题啊,我写一遍你试试看
SELECT table1.*
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL
我已经测试了,可以的

追问

是可以了,原因是查询速度太慢了,我没等到时间。速度为才能那么慢呀?左表总数据量才3000多条,不过,右表数据量大一点。能更好的办法查询吗?好了,我加分。

追答

这两个id不是主键吗?如果不是的话就加上索引吧

另外你尝试一下在数据库上用命令行或者phpmyadmin直接执行sql,就算再慢也不会超过20秒的,才3000条而已,我怀疑你是对sql返回值的处理有问题导致的慢。

追问

是索引的问题,已解决!谢谢!

追答

不客气。解决了就好

参考技术A left join 是以左边的表为主表,左边表满足的数据都会显示,而右边的表有的会显示没有的会显示null追问

意思我知道呀,现在我就是想查左边表有右边表没有的项呀,有别的办法吗?比如我想查左边ID为3的项,有好办法吗?

追答

    select * from table1 left join table2 on table1.id=table2.id where table2.id is null 

用table2.id is null 试试不用table2.id = null 

追问

好像还是不行呀。

追答

用右连接,这样查询出来的是两个表都有的数据,吧结果集中的左边表的主键循环出来,用逗号连接,然后再写一个sql语句,假设循环出来的主键的字符串是$a=1,2
$sql=select * from table1 where id not in ($a);

追问

不太明白,我数据量很大的,就想从中查出A表中有,B 表中没有的项

追答

首先select * from table1 right join table2 on table1.id=table2.id 这样查询出来不就是满足右边表的数据吗,也就是第一条和第二条数据,然后$sum=''; foreach($res as $key=>$val)
$sum=$val['左表中的主键的字段名'].','.$sum;

$sum=substr($sum,0,-1);
这样$sum不就是1,2了吗!
然后查询 select * from table1 where 主键的字段 not in ($sum);执行就是了

参考技术B 你好, where后边的"="是错误的, 应该写成"is",也就是说sql语句你这样试下
SELECT * FROM table1 LEFT JOIN user
ON table1.id = table2.id WHERE table2.id IS NULL
希望对你有所帮助!
参考技术C select * from table1 as t1 left join table2 as t2 wheret1.id=t2.id 参考技术D where要放在left join前边追问

是这样的吗?select * from table1 where table2.id=null left join table2 on table1.id=table2.id 试了试还是不行呀

追答

没看到有个有语的回答说null值要用is判断吗。还有我搞错了,where是放在join后面。

SQL多表联合查询(LEFT JOIN)条件差异

查询A:

select a.*,b.* into Bus605115_ON_Where_And --(642 行受影响)
from PositionN a left join szt b
on b.[fQCBH]=a.fBusNo
where fdealtime between fDInTime and fDInTimeN
and fbusno=605115

查询B:

select a.*,b.* into Bus605115_ON_And_Where --(835 行受影响)
from PositionN a left join szt b
on b.[fQCBH]=a.fBusNo
and fdealtime between fDInTime and fDInTimeN
where fbusno=605115

查询A、B的结果差异:

select * from Bus605115_ON_And_Where a
where not exists
(
select 1 from Bus605115_ON_Where_And b
where a.fGuid=b.fGuid
)
order by a.fDInTime

 

查询A中只有两表互相之间能关联的结果;

查询B中还包含未与b关联的结果,因此记录数比查询A多;

 

以上是关于MYSQL多表查询问题,left join的使用问题求教的主要内容,如果未能解决你的问题,请参考以下文章

mysql多表left join联合查询效率问题5

mysql多表left join联合查询效率问题5

Mysql 多表关联查询 Left join 查询?

Mysql多表left join关联查询全表扫描问题

业务数据LEFT JOIN 多表查询慢--优化操作

Mysql 多表查询