V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
xudzhang
V2EX  ›  MySQL

请教一个 SQL 语句的问题

  •  
  •   xudzhang · 2020-02-05 12:27:20 +08:00 · 3009 次点击
    这是一个创建于 1756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个 MySQL 的表,结构是这样的:

    a b

    a1 b1

    a2 b2

    a2 b3

    其中 a-b 是 1-N 的关系。现在给定一堆 b,要求返回所有 b 对应的 a 的所有记录。一种实现方式是:

    SELECT * FROM table WHERE a IN (SELECT a FROM table WHERE b IN ('b1', 'b2', 'b3'));

    请教一下,有没有更高效的语句?

    5 条回复    2020-02-06 11:31:15 +08:00
    sunnyadamm
        1
    sunnyadamm  
       2020-02-05 12:31:50 +08:00 via Android
    left join
    saulshao
        2
    saulshao  
       2020-02-05 16:02:29 +08:00   ❤️ 1
    这个看起来没有了,left join 最后给你的变化也就是个写法上的差异,现代关系数据库优化后和你写的这个子查询基本没差异。
    这个限制在于后面那个 in 里面如果是常量,可能会由于列表增加而导致 SQL 语句长度超长....
    yeyu1989
        3
    yeyu1989  
       2020-02-05 16:35:41 +08:00
    说的不是很清楚啊
    如果是一张表,用 distinct 就行
    如果是两张表,用 exists 理论上更快
    Codelike
        4
    Codelike  
       2020-02-06 03:20:31 +08:00
    你说的应该是一张表,直接用 distinct。至于 sql 语句过长的问题,可以在 service 层进行分批处理,然后用 set 汇总。
    CRVV
        5
    CRVV  
       2020-02-06 11:31:15 +08:00
    楼主描述的问题和给出的 SQL 不是同一个问题

    如果表里的数据是
    a1 b1
    a2 b2
    a2 b3
    a2 b4

    SQL 返回的是
    a1 b1
    a2 b2
    a2 b3
    a2 b4

    但是看描述应该返回
    a1
    a2

    如果把 SQL 的开头改成 SELECT a FROM ......
    结果是
    a1
    a2
    a2
    a2

    还有一种你可能想要的结果是
    a1
    a2
    a2

    还有一种你可能想要的结果是
    a1 b1
    a2 b2
    a2 b3

    所以请问楼主,你到底要哪一种结果?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4638 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:03 · PVG 18:03 · LAX 02:03 · JFK 05:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.