请教把三个 SELECT 操作整合到一个 SELECT 能解决的语句? - V2EX
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 3698 次点击
    这是一个创建于 1876 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前写的语句:
    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 效率更高
    /tr>
    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     Solana     889 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 21:24 PVG 05:24 LAX 14:24 JFK 17:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86