MySQL 语句求指点

2020-12-25 13:07:26 +08:00
 sytnishizuiai
<thead> </thead>
id fid date
1 a 2020-12-10
2 a 2020-12-30
3 b 2020-12-15

求教下,我写多表联查的时候,子表想要 date 小于当前日期,fid 相同的都不要( date<2020-12-25, 所有 fid=a 都不要),这种怎么写,想了好久写不出也查不到。 实在不行我就入库的时候算出最大日期存入主表了。(而且多表查询还要分页)

1773 次点击
所在节点    MySQL
9 条回复
l00t
2020-12-25 13:25:25 +08:00
先把需求想清楚说明白…… 多表联查,表呢?要查什么?关联条件是什么?
sytnishizuiai
2020-12-25 13:35:32 +08:00
@l00t 抱歉,因为表比较多,想先问问如果单表发生这种情况该怎么办。刚才用 MAX 可以了,但是多表查越写越复杂,之前就已经 3 表查了,现在要 4 表了。

所以准备拆开查,反正性能没什么要求,后台用。
berg223
2020-12-25 13:42:41 +08:00
第一步:select count(*),fid from <table> where date < 2020-12-25 group by fid
第二步:结果集中过滤掉 count(*) > 1 的行即可。实现这一步有两种选择方式:1.在业务代码中实现; 2.继续用 sql 实现,写完不要忘记用 explain 看一下可不可以走索引。
sytnishizuiai
2020-12-25 13:51:04 +08:00
@berg223 嗯,和我用 max 找出每组 fid 最大的 date 效果一样,不过会造成 4 表查询,准备不走这条路了,要么入库的时候把最大的 date 存入主表,这样简化查询,要么就重新写这块的多表查询。
谢谢。
hanbin
2020-12-25 14:08:40 +08:00
EXPLAIN SELECT
MASTER.id
FROM
MASTER jion other_a AS a ON MASTER.id = a.master_id
WHERE
a.date < 2020-12-25
AND a.fid <> 'a'

联表查询、联合查询、临时表、条件语句组合使用即可。没有用 sql 解决不了的需求,如果有,那就是学会的奇淫技巧不够。
keepeye
2020-12-25 14:11:53 +08:00
@hanbin 他要的是过滤 fid 出现超过一次的,不是特指 'a'
keepeye
2020-12-25 14:15:57 +08:00
子查询不能用 group by 吗?
select a.*, b.* from a inner join (select fid, count(*) as c from b where `date` < '当前日期' group by fid having c = 1) as b WHERE 其他条件..
sytnishizuiai
2020-12-25 15:33:27 +08:00
@keepeye 嗯,我刚才测试 max group by 把数据筛选后再联结查,不过就 4 个表联查了,我准备这个表单独写个查,然后数据合并筛选,这样方便点。
sytnishizuiai
2020-12-25 16:01:37 +08:00
这功能刚才讨论后不做了。。。太棒了。。。

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

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

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

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

© 2021 V2EX