例如: tb_bussiness_info表,有字段id,buss_id,buss_name,另一张表tb_sender_info,有字段id,buss_id1,buss_id2,buss_id3,inserttime,就是tb_sender_info里的buss_id1,buss_id2,buss_id3都是和tb_bussiness_info的buss_id相关联,怎么同时查找到tb_sender_info中buss_id1对应buss_name,buss_id2对应buss_name,buss_id3对应buss_name
select b1.buss_name, b2.buss_name, b3.buss_name from tb_sender_info i left join tb_bussiness_info b1 on i.buss_id1 = b1.buss_id left join tb_bussiness_info b2 on i.buss_id2 = b1.buss_id left join tb_bussiness_info b3 on i.buss_id3 = b1.buss_id
没有亲测,不知对不对。我比较好奇的是,为什么不是在bussiness中加sender的id,而是在sender中加了三个bussiness的id,看起来business和sender是多对一的关系啊
这样我试过,结果就是第一个数据是对的,后面两个数据都是NULL值,--人家建的表,规定了关系,我也没办法改
@liangzai1996: 错的???会不会本来就是null呀
@会长: 不是,都是有值的,我查过的
@liangzai1996: 亲测可行:
DROP TABLE IF EXISTS `t1`; CREATE TABLE `t1` ( `t1id` int(11) NOT NULL AUTO_INCREMENT, `t1name` varchar(255) DEFAULT NULL, PRIMARY KEY (`t1id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t1 -- ---------------------------- INSERT INTO `t1` VALUES ('1', 'name1'); INSERT INTO `t1` VALUES ('2', 'nam2'); INSERT INTO `t1` VALUES ('3', 'name3');
DROP TABLE IF EXISTS `t2`; CREATE TABLE `t2` ( `t2id` tinyint(4) NOT NULL AUTO_INCREMENT, `t1id1` tinyint(4) DEFAULT NULL, `t1id2` tinyint(4) DEFAULT NULL, `t1id3` tinyint(4) DEFAULT NULL, PRIMARY KEY (`t2id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t2 -- ---------------------------- INSERT INTO `t2` VALUES ('1', '1', '1', '1'); INSERT INTO `t2` VALUES ('2', '2', '2', '2'); INSERT INTO `t2` VALUES ('3', '3', '3', '3'); INSERT INTO `t2` VALUES ('4', '1', '2', '3');
SELECT tt1.t1name, tt2.t1name, tt3.t1name FROM t2 JOIN t1 tt1 ON t2.t1id1 = tt1.t1id JOIN t1 tt2 ON t2.t1id2 = tt2.t1id JOIN t1 tt3 ON t2.t1id3 = tt3.t1id
@会长: 你这种方法可以,但是我的数据量太大的结果导致查了1分钟多才查完,可能需要改进
@liangzai1996: 如果值比较离散的话,加上索引试试吧
@liangzai1996: 不知道你数据量有多大。如果可以的话,先把两个表的数据载入内存,在内存中匹配应该会快一些
@会长: 一张表是二十多万条,另一个三十多万条数据
@liangzai1996: 那还行吧。可以试试都放到内存然后再匹配,最后看看用这种方法内存得多少,合适不合适。能用索引解决最好还是用索引。不行再考虑这种。还有就是这好几十万难道要一次查询出来,没一个分页吗
@会长: 对,分页显示的,sql在数据库执行了3分半多才结束
@liangzai1996: 不会一次都查出来吧。如果真是查出一小部分,2,3十万数据也不至于1分钟呀。先考虑看能不能通过索引优化吧