我该如何优化这样一条sql?

SELECT 
    * 
FROM `t_test` 
WHERE ( `pid` IN ( SELECT id FROM `t_test` WHERE `pid` = '1' AND type = 1 ) AND type = 2 ) OR ( `pid` = '1' AND type = 2 )

数据表结构如下:

clipboard.png

上面的语句是否可以优化?

表的:
INSERT INTO agent.t_test (id, pid, type) VALUES ('1', '0', '0');
INSERT INTO agent.t_test (id, pid, type) VALUES ('2', '1', '1');
INSERT INTO agent.t_test (id, pid, type) VALUES ('3', '2', '2');
INSERT INTO agent.t_test (id, pid, type) VALUES ('4', '1', '2');
INSERT INTO agent.t_test (id, pid, type) VALUES ('5', '1', '1');
INSERT INTO agent.t_test (id, pid, type) VALUES ('6', '5', '2');
INSERT INTO agent.t_test (id, pid, type) VALUES ('7', '2', '2');
INSERT INTO agent.t_test (id, pid, type) VALUES ('8', '5', '1');

CREATE TABLE t_test (
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) NOT NULL,
type tinyint(4) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;

结果:

clipboard.png

阅读 1.6k
2 个回答
WHERE ( `pid` IN ( SELECT id FROM `t_test` WHERE `pid` = '1') AND type = 2 )
select a.* from t_test a join 
(select '1' id union    
SELECT id FROM `t_test` WHERE `pid` = '1' AND type = 1) b
on a.pid=b.id and a.type=2;

数据量大的话pid要加个索引

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题