首页 新闻 会员 周边 捐助

sql,一张表的多字段,与另一张表的一个字段关联并获取其他字段的值

-1
悬赏园豆:5 [已解决问题] 解决于 2017-10-11 09:54

例如:   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

liangzai1996的主页 liangzai1996 | 初学一级 | 园豆:135
提问于:2017-10-10 16:28
< >
分享
最佳答案
0
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是多对一的关系啊

收获园豆:5
会长 | 专家六级 |园豆:12463 | 2017-10-10 16:58

这样我试过,结果就是第一个数据是对的,后面两个数据都是NULL值,--人家建的表,规定了关系,我也没办法改

liangzai1996 | 园豆:135 (初学一级) | 2017-10-10 17:00

@liangzai1996: 错的???会不会本来就是null呀

会长 | 园豆:12463 (专家六级) | 2017-10-10 17:09

@会长: 不是,都是有值的,我查过的

liangzai1996 | 园豆:135 (初学一级) | 2017-10-10 17:09

@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

会长 | 园豆:12463 (专家六级) | 2017-10-10 17:17

@会长: 你这种方法可以,但是我的数据量太大的结果导致查了1分钟多才查完,可能需要改进

liangzai1996 | 园豆:135 (初学一级) | 2017-10-10 17:27

@liangzai1996: 如果值比较离散的话,加上索引试试吧

会长 | 园豆:12463 (专家六级) | 2017-10-10 17:30

@liangzai1996: 不知道你数据量有多大。如果可以的话,先把两个表的数据载入内存,在内存中匹配应该会快一些

会长 | 园豆:12463 (专家六级) | 2017-10-10 17:31

@会长: 一张表是二十多万条,另一个三十多万条数据

liangzai1996 | 园豆:135 (初学一级) | 2017-10-10 17:32

@liangzai1996: 那还行吧。可以试试都放到内存然后再匹配,最后看看用这种方法内存得多少,合适不合适。能用索引解决最好还是用索引。不行再考虑这种。还有就是这好几十万难道要一次查询出来,没一个分页吗

会长 | 园豆:12463 (专家六级) | 2017-10-10 17:35

@会长: 对,分页显示的,sql在数据库执行了3分半多才结束

liangzai1996 | 园豆:135 (初学一级) | 2017-10-10 17:36

@liangzai1996: 不会一次都查出来吧。如果真是查出一小部分,2,3十万数据也不至于1分钟呀。先考虑看能不能通过索引优化吧

会长 | 园豆:12463 (专家六级) | 2017-10-10 17:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册