前两天写了一个sql 使用了 in ,由于数据量很大,所以当时并没有发现有什么问题,后来清理了一下数据库,发现查出的结果并不是特别准确,鱼食就开始找原因,为什么会这样,我最开始的猜测是数据错误,但是检查过后这个猜测被排除了,第二个猜测是哪些条件查的有问题,于是又仔仔细细的看了一遍sql,也并没有发现问题所在。最后实在没办法我把sql拆开一点点执行,发现只能查询出 集合的第一个值 ,例如 我的集合是 140,200,210 只能查出值为140 的,200 210 的都查不出来。找到了问题所在,那么就好解决了。我开始查为什么in 只能查出第一个集合的值,发现我的集合其实并不是真正的集合是一个字符串,只是形式是集合的形式
我的 sql以及表结构:
select count(*) as sl ,lm.id ,lm.name from (select n.lmid,l.name ,l.plmstr,l.id from t_news n left join t_lm l on n.lmid=l.id where n.sts='Y' ) t left join t_lm lm on lm.id in (t.plmstr) or lm.id=t.id where lm.sts='Y ' and lm.parentid is null group by lm.id order by lm.id asc
最后的解决方案是 使用FIND_IN_SET ,具体的使用方法是FIND_IN_SET(str,strlist),我的sql最后改为:
select count(*) as sl ,lm.id ,lm.name from (select n.lmid,l.name ,l.plmstr,l.id from t_news n left join t_lm l on n.lmid=l.id where n.sts='Y' ) t left join t_lm lm on FIND_IN_SET (lm.id ,t.plmstr) or lm.id=t.id where lm.sts='Y ' and lm.parentid is null group by lm.id order by lm.id asc