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 · 60 天前 · 2020 次点击
    这是一个创建于 60 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前写的语句:
    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   60 天前
    照下面这样写就行了,直接出结果。
    ···
    SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
    ···
    jay0726
        2
    jay0726   60 天前
    刚想回复,楼上抢先一步啊
    saulshao
        3
    saulshao   60 天前
    为啥这个 md 语法不起作用?
    wangyanrui
        4
    wangyanrui   60 天前 via Android
    union 成临时表,然后排序加 limit 1
    但是这玩意如果性能压力不是特别大,还是代码处理吧,可读性太差了
    saulshao
        5
    saulshao   60 天前
    写错,markdown
    wangyanrui
        6
    wangyanrui   60 天前 via Android
    瞎了,一楼正解。以为不是同一个表😂😂
    saulshao
        7
    saulshao   60 天前
    这玩意如果不是性能压力特别大,反而不建议代码处理,因为这东西外面套个函数,就相当于可读性了。
    MeowOvO
        8
    MeowOvO   60 天前
    ```
    SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
    ```
    @saulshao Test
    MeowOvO
        9
    MeowOvO   60 天前
    @MeowOvO OK 也不好用=-=
    aborigine
        10
    aborigine   60 天前
    select min(生成时间) from result where 型号=1 or 型号=2 or 型号=3
    aborigine
        11
    aborigine   60 天前
    如果生成时间没有索引 那用 min 效率更高
    ysc3839
        12
    ysc3839   60 天前 via Android
    @saulshao @MeowOvO
    回复内容不支持 MarkDown 。
    mcdunc
        13
    mcdunc   60 天前 via Android
    lz 是想分别把型号为 1,2,3 的最早生成时间给抽出来吗还是查总体的最早生成时间?如果按 1 楼的那种查出来的不应该是总体的最早吗?
    a719114136
        14
    a719114136   60 天前 via Android
    select 型号,min(时间) from xx where 型号 in(1,2,3) group by 型号
    someonedeng
        15
    someonedeng   60 天前
    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   60 天前
    不考虑性能情况下,内层 union,外层再 select * limit 一次即可
    xuanbg
        17
    xuanbg   60 天前
    @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   60 天前
    @xuanbg sql 复制过来忘记改了,15 楼的是正确的。
    guanhui07
        19
    guanhui07   60 天前
    ```
    unionall
    ```
    coderfox
        20
    coderfox   60 天前
    SELECT 型号, MAX(生成时间) FROM result WHERE 型号 IN ('1', '2', '3') GROUP BY 型号 ORDER BY 型号, 生成时间 DESC;
    coderfox
        21
    coderfox   60 天前
    @coderfox #20 更正一下,只需要 SELECT 型号, MAX(生成时间) FROM test WHERE 型号 IN ('1', '2', '3') GROUP BY 型号;
    jzmws
        22
    jzmws   60 天前
    考虑用 case ?
    bigpower777
        23
    bigpower777   60 天前
    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   59 天前 via Android
    pg 或者 mysql8 用窗口函数
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4503 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 09:17 · PVG 17:17 · LAX 02:17 · JFK 05:17
    ♥ Do have faith in what you're doing.