在记录的可用日期中找出最大的日期,然后将输出映射到其他类似的输出以找到所有日期中最大的
Posted
技术标签:
【中文标题】在记录的可用日期中找出最大的日期,然后将输出映射到其他类似的输出以找到所有日期中最大的【英文标题】:Finding out the greatest among the available dates for a record, then mapping the output to other similar outputs to find the greatest among all 【发布时间】:2014-10-15 14:25:00 【问题描述】:我有 6 个表,其中 5 个表的公用键是 account,所有这些表的公用键是 id。
其中 5 个有 4-5 个日期字段。现在,我的任务是使用 where 条件:id = 10 查找表中记录可用的最大日期。现在类似地在所有其他表中查找同一记录的最大日期。在所有表中都没有这样的约束,例如 account 必须是相同的数字,对于所有不同的表中相同的 id,它可以不同。
现在我必须找到相应的帐户,它具有最大值。与传递的 id 值相对应的所有日期值。
请帮忙!!
【问题讨论】:
你能把表格数据,比如tbl_name,字段..和1行作为每个表格的例子。还你什么查询?php?还是 zf2 代码? 我只想要查询结构,这就是为什么我提供了我正在使用的元素的示例..“account”和“id”。我不擅长联合,所以无法实现。 表“A”字段:id;日期1;日期2;日期3;日期4;日期5; account TABLE 'B' 、 TABLE 'C' 、 TABLE 'D' 和 TABLE 'E' 的相似表结构。 所以你需要最高列日期? 表“A”字段:id;日期1;日期2;日期3;日期4;日期5; account 对于 TABLE 'B' 、 TABLE 'C' 、 TABLE 'D' 、 TABLE 'E' 和 TABLE 'F' 的类似表结构: id ;日期1;日期2;日期3;日期4; date5 现在 TABLE 'F' 中的 id 是主键......并且必须由用户传递,这对于所有记录都是唯一的。但对应的账户可能不一样。我需要找出日期在哪个表中的值最高,以及对应的帐户。 【参考方案1】:SELECT
max(convert varchar, acct.account_date, 101)
FORM
account acct
WHERE
acct.id = (SELECT acct.id FROM id_tlb WHERE acct.id = 'something')
您可能不需要在那里转换日期,但它会帮助您获得mm/dd/yyyy
格式的时间戳。
如果您需要其他内容,请回复。
【讨论】:
该表有 5 个日期列。他需要 5 列的最大值,但也需要 5 个表的最大值。所以至少需要union,问题是如何获取最大列。 我想首先从所有记录中找到最大可用日期..,对于五个表。然后在所有这些中找到最大值。然后显示对应的账户值。 union'd 太贵了,会降低性能,我猜。我会使用存储的过程/函数。也许我会处理满足 where 条件的每一行并在那里找到最大值,直到找到我需要的最大值。看看有没有帮助。无论如何,存储过程无论如何都更具可扩展性。【参考方案2】:检查一下.. 查询看起来很糟糕,因为我认为表设计/需求冲突。
select max(dateB) AS max_date FROM
(
select max(dateA) AS dateB FROM
(
select date1 AS dateA from tb1 where id = 10
union
select date2 AS dateA from tb1 where id = 10
union
select date3 AS dateA from tb1 where id = 10
union
select date4 AS dateA from tb1 where id = 10
)
UNION
select max(dateA) AS dateB FROM
(
select date1 AS dateA from tb2 where id = 10
union
select date2 AS dateA from tb2 where id = 10
union
select date3 AS dateA from tb2 where id = 10
union
select date4 AS dateA from tb2 where id = 10
)
UNION
select max(dateA) AS dateB FROM
(
select date1 AS dateA from tb3 where id = 10
union
select date2 AS dateA from tb3 where id = 10
union
select date3 AS dateA from tb3 where id = 10
union
select date4 AS dateA from tb3 where id = 10
)
UNION
select max(dateA) AS dateB FROM
(
select date1 AS dateA from tb4 where id = 10
union
select date2 AS dateA from tb4 where id = 10
union
select date3 AS dateA from tb4 where id = 10
union
select date4 AS dateA from tb4 where id = 10
)
)
【讨论】:
是的。联盟的每一次行动都需要很长时间。我仍在为需求寻找更好的优化查询。【参考方案3】:是的,终于明白了。
select date1 , account from table1 where id = 'X' 联合所有 选择 date2 , account from table1 where id = 'X' 联合所有 选择 date3 ,来自 table1 的帐户,其中 id = 'X' 联合所有 选择 date4 ,来自 table2 的帐户,其中 id = 'X' 联合所有 选择 date5 , account from table2 where id = 'X' 联合所有 选择 date6 ,来自 table2 的帐户,其中 id = 'X' 联合所有 选择 date7 ,来自 table3 的帐户,其中 id = 'X' 联合所有
select date8 , account from table3 where id = 'X'
--------
--------
order by date1 desc limit 1;
希望现在这对其他人有所帮助。
【讨论】:
以上是关于在记录的可用日期中找出最大的日期,然后将输出映射到其他类似的输出以找到所有日期中最大的的主要内容,如果未能解决你的问题,请参考以下文章
Mongo Aggregation $subtract :对于两个非空日期总是给出空结果
用于删除重复(连续)记录的 SQL,但将最小日期存储在开始日期和最大日期作为结束日期