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