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
qazwsxkevin
V2EX  ›  MySQL

请教把三个 SELECT 操作整合到一个 SELECT 能解决的语句?

  •  
  •   qazwsxkevin · 2020-08-27 19:34:53 +08:00 · 3051 次点击
    这是一个创建于 1309 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前写的语句:
    SELECT 生成时间 FROM result WHERE `型号`='1' ORDER BY 生成时间 DESC LIMIT 1;
    SELECT 生成时间 FROM result WHERE `型号`='2' ORDER BY 生成时间 DESC LIMIT 1;
    SELECT 生成时间 FROM result WHERE `型号`='3' ORDER BY 生成时间 DESC LIMIT 1;

    生成时间是 datatime
    程序拿到结果后,再本地算法算出最小(时间最早的值)
    请问如果在 Mysql 语句上,如何实现一句出结果呢?
    `型号`='3'很有可能没有存在。。。
    24 条回复    2020-08-28 19:40:37 +08:00
    saulshao
        1
    saulshao  
       2020-08-27 19:41:15 +08:00
    照下面这样写就行了,直接出结果。
    ···
    SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
    ···
    jay0726
        2
    jay0726  
       2020-08-27 19:41:58 +08:00
    刚想回复,楼上抢先一步啊
    saulshao
        3
    saulshao  
       2020-08-27 19:42:26 +08:00
    为啥这个 md 语法不起作用?
    wangyanrui
        4
    wangyanrui  
       2020-08-27 19:42:35 +08:00 via Android
    union 成临时表,然后排序加 limit 1
    但是这玩意如果性能压力不是特别大,还是代码处理吧,可读性太差了
    saulshao
        5
    saulshao  
       2020-08-27 19:42:40 +08:00
    写错,markdown
    wangyanrui
        6
    wangyanrui  
       2020-08-27 19:43:20 +08:00 via Android
    瞎了,一楼正解。以为不是同一个表😂😂
    saulshao
        7
    saulshao  
       2020-08-27 19:43:47 +08:00
    这玩意如果不是性能压力特别大,反而不建议代码处理,因为这东西外面套个函数,就相当于可读性了。
    MeowOvO
        8
    MeowOvO  
       2020-08-27 19:48:17 +08:00
    ```
    SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
    ```
    @saulshao Test
    MeowOvO
        9
    MeowOvO  
       2020-08-27 19:48:35 +08:00
    @MeowOvO OK 也不好用=-=
    aborigine
        10
    aborigine  
       2020-08-27 20:46:11 +08:00
    select min(生成时间) from result where 型号=1 or 型号=2 or 型号=3
    aborigine
        11
    aborigine  
       2020-08-27 20:48:41 +08:00
    如果生成时间没有索引 那用 min 效率更高
    ysc3839
        12
    ysc3839  
       2020-08-27 21:55:44 +08:00 via Android
    @saulshao @MeowOvO
    回复内容不支持 MarkDown 。
    mcdunc
        13
    mcdunc  
       2020-08-27 22:05:19 +08:00 via Android
    lz 是想分别把型号为 1,2,3 的最早生成时间给抽出来吗还是查总体的最早生成时间?如果按 1 楼的那种查出来的不应该是总体的最早吗?
    a719114136
        14
    a719114136  
       2020-08-27 22:19:20 +08:00 via Android
    select 型号,min(时间) from xx where 型号 in(1,2,3) group by 型号
    someonedeng
        15
    someonedeng  
       2020-08-28 00:18:24 +08:00
    SELECT * from (SELECT 生成时间,1 as 型号 FROM result WHERE `型号`='1' ORDER BY 生成时间 DESC LIMIT 1 ) t1 union all
    SELECT * from (SELECT 生成时间,2 as 型号 FROM result WHERE `型号`='2' ORDER BY 生成时间 DESC LIMIT 1 ) t2 union all
    SELECT * from (SELECT 生成时间,3 as 型号 FROM result WHERE `型号`='3' ORDER BY 生成时间 DESC LIMIT 1) t3;

    ![20200828001706.png]( https://i.loli.net/2020/08/28/KsEdn2bCLhtMm9T.png)
    ![20200828001657.png]( https://i.loli.net/2020/08/28/GfwKF2HCMZ7tmQU.png)
    lyusantu
        16
    lyusantu  
       2020-08-28 08:46:02 +08:00
    不考虑性能情况下,内层 union,外层再 select * limit 一次即可
    xuanbg
        17
    xuanbg  
       2020-08-28 08:55:05 +08:00
    @saulshao 你这个不等价啊,人家是每个型号 1 条,你的可能 3 条都是 1 个型号。

    正确答案是使用 union all 关键词。

    SELECT 生成时间 FROM result WHERE `型号`='1' ORDER BY 生成时间 DESC LIMIT 1 union all
    SELECT 生成时间 FROM result WHERE `型号`='2' ORDER BY 生成时间 DESC LIMIT 1 union all
    SELECT 生成时间 FROM result WHERE `型号`='3' ORDER BY 生成时间 DESC LIMIT 1;
    xuanbg
        18
    xuanbg  
       2020-08-28 08:56:06 +08:00
    @xuanbg sql 复制过来忘记改了,15 楼的是正确的。
    guanhui07
        19
    guanhui07  
       2020-08-28 09:05:00 +08:00
    ```
    unionall
    ```
    coderfox
        20
    coderfox  
       2020-08-28 09:42:13 +08:00
    SELECT 型号, MAX(生成时间) FROM result WHERE 型号 IN ('1', '2', '3') GROUP BY 型号 ORDER BY 型号, 生成时间 DESC;
    coderfox
        21
    coderfox  
       2020-08-28 09:47:54 +08:00
    @coderfox #20 更正一下,只需要 SELECT 型号, MAX(生成时间) FROM test WHERE 型号 IN ('1', '2', '3') GROUP BY 型号;
    jzmws
        22
    jzmws  
       2020-08-28 09:54:53 +08:00
    考虑用 case ?
    bigpower777
        23
    bigpower777  
       2020-08-28 16:54:46 +08:00
    SELECT
    s1.d1,
    s2.d2,
    s3.d3
    FROM
    (select CREATE_DATE as d1 from account_system where MZ='01' ORDER BY CREATE_DATE desc limit 1) s1,
    (select CREATE_DATE as d2 from account_system where MZ='02' ORDER BY CREATE_DATE desc limit 1) s2,
    (select CREATE_DATE as d3from account_system where MZ='03' ORDER BY CREATE_DATE desc limit 1) s3
    gaius
        24
    gaius  
       2020-08-28 19:40:37 +08:00 via Android
    pg 或者 mysql8 用窗口函数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5610 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:41 · PVG 09:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.