mysql子查询多字段_(mysql)多个字段需要子查询,求优化

博客探讨了在MySQL中遇到的查询性能瓶颈,主要涉及到A表和B表的连接查询。A表包含code_id和code_field,B表包含code_id、code_name和field_name。当前使用多个子查询获取B表的特定属性(如国籍、籍贯),导致查询速度极慢。尝试的优化方案包括联表查询,但效果不佳。博主寻求关于如何有效优化此类查询的建议和解决方案。
摘要由CSDN通过智能技术生成

问个问题,(MySQL)A表的字端有code_name,code_id,code_field,另一表B表有很多属性,例如国籍,籍贯等等,国籍子查询查法为select code_name form A表 where code_id=B表.gj_id and code_field = ‘gj’。

现在遇到的困难时子查询太慢了,而且除了国籍外还有籍贯等属性,如果都去用子查询的话,一次估计几分钟。这种情况下能不能用联表……

请问有没有什么好的解决方案!

文笔不行,可以直接看下面代码,看看怎么优化

select

(select code_name from A where code_id = B.GJ and field_name = 'GJ') as GJ, -- 国籍

(select code_name from A where code_id = B.JG and field_name = 'JG') as JG, -- 籍贯

(select code_name from A where code_id = B.SYD and field_name = 'SYD') as SYD-- 生源地

FROM B;

麻烦了!!!

以下为大致的表结构(不好发正式的表结构)

A表

CREATE TABLE `NewTable` (

`id`  int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键' ,

`GJ`  int(11) NOT NULL ,

`JG`  int(11) NOT NULL ,

`MZ`  int(11) NOT NULL ,

PRIMARY KEY (`id`)

)

ENGINE=MyISAM

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

AUTO_INCREMENT=3

CHECKSUM=0

ROW_FORMAT=FIXED

DELAY_KEY_WRITE=0

;

B表

CREATE TABLE `NewTable` (

`id`  int(11) NOT NULL ,

`code_id`  int(11) NOT NULL ,

`code_name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

`field_name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

PRIMARY KEY (`id`)

)

ENGINE=MyISAM

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

CHECKSUM=0

ROW_FORMAT=DYNAMIC

DELAY_KEY_WRITE=0

;

A表图

1f19fc21841869e7c8464b7b62ee902d.png

B表图

733b6bf70a5ba34520ca69378f68b9a5.png

如果用子查询

select

(select code_name from B where code_id = A.GJ and field_name = 'GJ') as GJ

(select code_name from B where code_id = A.MZ and field_name = 'MZ') as MZ

(select code_name from B where code_id = A.JG and field_name = 'JG') as JG

FROM

A;

以上是大概的结构!现在是需要优化查询的语句……

我的尝试

select

B.code_name,C.code_name

FROM

A

JOIN B

ON

B.code_id = A.GJ AND B.field_name = 'GJ'

JOIN B as C

ON

C.code_id = A.MZ AND C.field_name = 'MZ'

这种嵌套join的写法,竟然比子查询还要漫长……这是什么原因呢,知道的也可以说一下哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值