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 都不要),这种怎么写,想了好久写不出也查不到。 实在不行我就入库的时候算出最大日期存入主表了。(而且多表查询还要分页)
1
l00t 2020-12-25 13:25:25 +08:00
先把需求想清楚说明白…… 多表联查,表呢?要查什么?关联条件是什么?
|
2
sytnishizuiai OP @l00t 抱歉,因为表比较多,想先问问如果单表发生这种情况该怎么办。刚才用 MAX 可以了,但是多表查越写越复杂,之前就已经 3 表查了,现在要 4 表了。
所以准备拆开查,反正性能没什么要求,后台用。 |
3
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 看一下可不可以走索引。 |
4
sytnishizuiai OP @berg223 嗯,和我用 max 找出每组 fid 最大的 date 效果一样,不过会造成 4 表查询,准备不走这条路了,要么入库的时候把最大的 date 存入主表,这样简化查询,要么就重新写这块的多表查询。
谢谢。 |
5
hanbin 2020-12-25 14:08:40 +08:00
|
7
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 其他条件.. |
8
sytnishizuiai OP @keepeye 嗯,我刚才测试 max group by 把数据筛选后再联结查,不过就 4 个表联查了,我准备这个表单独写个查,然后数据合并筛选,这样方便点。
|
9
sytnishizuiai OP 这功能刚才讨论后不做了。。。太棒了。。。
|