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

2020-08-27 19:34:53 +08:00
 qazwsxkevin
以前写的语句:
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'很有可能没有存在。。。
3315 次点击
所在节点    MySQL
24 条回复
saulshao
2020-08-27 19:41:15 +08:00
照下面这样写就行了,直接出结果。
···
SELECT 生成时间 FROM result WHERE `型号`in (1,2,3) ORDER BY 生成时间 DESC LIMIT 1;
···
jay0726
2020-08-27 19:41:58 +08:00
刚想回复,楼上抢先一步啊
saulshao
2020-08-27 19:42:26 +08:00
为啥这个 md 语法不起作用?
wangyanrui
2020-08-27 19:42:35 +08:00
union 成临时表,然后排序加 limit 1
但是这玩意如果性能压力不是特别大,还是代码处理吧,可读性太差了
saulshao
2020-08-27 19:42:40 +08:00
写错,markdown
wangyanrui
2020-08-27 19:43:20 +08:00
瞎了,一楼正解。以为不是同一个表😂😂
saulshao
2020-08-27 19:43:47 +08:00
这玩意如果不是性能压力特别大,反而不建议代码处理,因为这东西外面套个函数,就相当于可读性了。
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
2020-08-27 19:48:35 +08:00
@MeowOvO OK 也不好用=-=
aborigine
2020-08-27 20:46:11 +08:00
select min(生成时间) from result where 型号=1 or 型号=2 or 型号=3
aborigine
2020-08-27 20:48:41 +08:00
如果生成时间没有索引 那用 min 效率更高
ysc3839
2020-08-27 21:55:44 +08:00
@saulshao @MeowOvO
回复内容不支持 MarkDown 。
mcdunc
2020-08-27 22:05:19 +08:00
lz 是想分别把型号为 1,2,3 的最早生成时间给抽出来吗还是查总体的最早生成时间?如果按 1 楼的那种查出来的不应该是总体的最早吗?
a719114136
2020-08-27 22:19:20 +08:00
select 型号,min(时间) from xx where 型号 in(1,2,3) group by 型号
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
2020-08-28 08:46:02 +08:00
不考虑性能情况下,内层 union,外层再 select * limit 一次即可
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
2020-08-28 08:56:06 +08:00
@xuanbg sql 复制过来忘记改了,15 楼的是正确的。
guanhui07
2020-08-28 09:05:00 +08:00
```
unionall
```
coderfox
2020-08-28 09:42:13 +08:00
SELECT 型号, MAX(生成时间) FROM result WHERE 型号 IN ('1', '2', '3') GROUP BY 型号 ORDER BY 型号, 生成时间 DESC;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702006

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX