› 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 · Aug 27, 2020 · 4427 views
    This topic created in 2227 days ago, the information mentioned may be changed or developed.
    以前写的语句:
    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 replies  •  2020-08-28 19:40:37 +08:00
    saulshao
        1
    saulshao  
       Aug 27, 2020
    照下面这样写就行了,直接出结果。
    ···
    SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
    ···
    jay0726
        2
    jay0726  
       Aug 27, 2020
    刚想回复,楼上抢先一步啊
    saulshao
        3
    saulshao  
       Aug 27, 2020
    为啥这个 md 语法不起作用?
    wangyanrui
        4
    wangyanrui  
       Aug 27, 2020 via Android
    union 成临时表,然后排序加 limit 1
    但是这玩意如果性能压力不是特别大,还是代码处理吧,可读性太差了
    saulshao
        5
    saulshao  
       Aug 27, 2020
    写错,markdown
    wangyanrui
        6
    wangyanrui  
       Aug 27, 2020 via Android
    瞎了,一楼正解。以为不是同一个表😂😂
    saulshao
        7
    saulshao  
       Aug 27, 2020
    这玩意如果不是性能压力特别大,反而不建议代码处理,因为这东西外面套个函数,就相当于可读性了。
    MeowOvO
        8
    MeowOvO  
       Aug 27, 2020
    ```
    SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
    ```
    @saulshao Test
    MeowOvO
        9
    MeowOvO  
       Aug 27, 2020
    @MeowOvO OK 也不好用=-=
    aborigine
        10
    aborigine  
       Aug 27, 2020
    select min(生成时间) from result where 型号=1 or 型号=2 or 型号=3
    aborigine
        11
    aborigine  
       Aug 27, 2020
    如果生成时间没有索引 那用 min 效率更高
    ysc3839
        12
    ysc3839  
       Aug 27, 2020 via Android
    @saulshao @MeowOvO
    回复内容不支持 MarkDown 。
    mcdunc
        13
    mcdunc  
       Aug 27, 2020 via Android
    lz 是想分别把型号为 1,2,3 的最早生成时间给抽出来吗还是查总体的最早生成时间?如果按 1 楼的那种查出来的不应该是总体的最早吗?
    a719114136
        14
    a719114136  
       Aug 27, 2020 via Android
    select 型号,min(时间) from xx where 型号 in(1,2,3) group by 型号
    someonedeng
        15
    someonedeng  
       Aug 28, 2020
    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  
       Aug 28, 2020
    不考虑性能情况下,内层 union,外层再 select * limit 一次即可
    xuanbg
        17
    xuanbg  
       Aug 28, 2020
    @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  
       Aug 28, 2020
    @xuanbg sql 复制过来忘记改了,15 楼的是正确的。
    guanhui07
        19
    guanhui07  
       Aug 28, 2020
    ```
    unionall
    ```
    coderfox
        20
    coderfox  
       Aug 28, 2020
    SELECT 型号, MAX(生成时间) FROM result WHERE 型号 IN ('1', '2', '3') GROUP BY 型号 ORDER BY 型号, 生成时间 DESC;
    coderfox
        21
    coderfox  
       Aug 28, 2020
    @coderfox #20 更正一下,只需要 SELECT 型号, MAX(生成时间) FROM test WHERE 型号 IN ('1', '2', '3') GROUP BY 型号;
    jzmws
        22
    jzmws  
       Aug 28, 2020
    考虑用 case ?
    bigpower777
        23
    bigpower777  
       Aug 28, 2020
    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  
       Aug 28, 2020 via Android
    pg 或者 mysql8 用窗口函数
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2116 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 00:30 · PVG 08:30 · LAX 17:30 · JFK 20:30
    ♥ Do have faith in what you're doing.