mysql - sql 根据明细表一个字段查询主表列表,使用group,disctinct还是exists
巴扎黑
巴扎黑 2017-04-17 14:50:47
0
2
676

有两个表:
A:

| id | name | ---id主键

B:

| id | a_id | item_id | item_name | desc | ----id主键,a_id 与 A中的id关联

查询-包含item_id的所有的A记录

SELECT DISTINCT A.* FROM A JOIN B ON A.id = B.a_id WHERE item_id = 123;

SELECT A.* FROM A JOIN B ON A.id = B.a_id WHERE B.item_id =123 GROUP BY A.id;

SELECT A.* FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.a_id = A.id and B.item_id = 123);

这三种查询那种最好?

巴扎黑
巴扎黑

모든 응답(2)
黄舟

如果数据量很大的话第二种和第三种都不建议你用。推荐你用第一种。我们做项目的时候每次DBA审查我们的SQL只要出现子查询或者SQL用到GROUP BY都会问我们数据量大小还有表是怎么建的,都会建议我们不用GROUP BY和子查询。老是说效率慢……我是菜鸟具体怎么慢我也不清楚

伊谢尔伦

建议采用第3种,从语义上最符合你的要求,效率上也应该是最高的。
第1种写法,采用表链接的方式,如果表A和表B是一对多的关系,扫描B的记录会超出需要(需求是找到一条即可,使用JOIN的方式是全部找了),另外由于使用distinct,数据库内部可能需要排序操作,效率会受一定的影响。
第2种写法,不是标准的sql,group by只有一个字段,理论上SELECT中A.*这种写法是不支持的,效率应该和第一种差不多。
第3种写法,exists语句会被数据库优化为半连接(oracle中是这样的,mysql需要自己看执行计划合适),因此效率上是最高的。

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿