在另一个 INNER JOIN 中使用 INNER JOIN 结果 table
Using INNER JOIN resulting table in another INNER JOIN
我不太确定标题是否真的对应,也许我的方法是错误的。
我有以下数据库结构:
TABLE producers
id
TABLE data
id
date
value
producer_id OneToMany
首先,对于每个制作人,我想获得最新的 date
注册 data
。下面的代码正是这样做的:
SELECT producers.id AS producer_id, max.date AS max_date
FROM producers
INNER JOIN data ON producers.id = data.producer_id
INNER JOIN (
SELECT producer_id, MAX(date) AS date
FROM data
GROUP BY producer_id
) AS max USING (producer_id, date)
结果table是:
----------------------------------------------------
| producer_id | max_date |
----------------------------------------------------
| 5 | 2022-01-01 01:45:00.000 +0000 |
| 7 | 2022-01-01 01:45:00.000 +0000 |
| 14 | 2022-01-01 01:45:00.000 +0000 |
| 15 | 2022-01-01 01:45:00.000 +0000 |
| 17 | 2022-01-01 01:45:00.000 +0000 |
----------------------------------------------------
接下来我需要的是 SUM
每个生产者的所有 data
记录 WITH date
大于 max_date
我们在上一个查询的 INNER JOIN
之后为每个生产者获得了。 SUM()
将在列 value
上执行。
希望这很清楚,如果不清楚,请告诉我。我试过做另一个 INNER JOIN
并在 WHERE
子句中使用 table max
但是我得到一个错误告诉我 table 在那里,但是无法在该部分查询中使用。
也许另一个 INNER JOIN
不是解决方案。在这里,我受到 SQL 知识的限制,我真的不知道应该阅读哪些关键字 in-depth 以了解什么是最好的方法以及如何去做。因此,将我重定向到最佳路径的信息真的很有帮助。
提前致谢。
编辑:忘记指定 SUM()
将在哪一列执行。
编辑 2:刚刚意识到我在这里要问的是,结果将始终为空 table,因为永远不会有 date
更大的记录。当我写我的数据库的简化版本时,忘记添加一个table/join,这就是原因。但最终 approach/solution 仍然是相同的,只是应用于不同的 table。再次抱歉。
问题中的第一个查询可以使用 distinct on
和 order by
大大简化:
select distinct on (p.id)
p.id, d.date
from producers p
join data d on p.id = d.producer_id
order by p.id, d.date desc;
至于“将每个生产者的所有数据记录与日期大于 max_date 相加”——好吧,none 存在日期大于最新的。这是一个这样做的查询(即使结果将是空的)
select producer_id, sum(value)
from data d inner join -- the query above follows
(
select distinct on (p.id)
p.id producer_id, d.date
from producers p
join data d on p.id = d.producer_id
order by p.id, d.date desc
) t using (producer_id)
where d.date > t.date
group by producer_id;
我不太确定标题是否真的对应,也许我的方法是错误的。
我有以下数据库结构:
TABLE producers
id
TABLE data
id
date
value
producer_id OneToMany
首先,对于每个制作人,我想获得最新的 date
注册 data
。下面的代码正是这样做的:
SELECT producers.id AS producer_id, max.date AS max_date
FROM producers
INNER JOIN data ON producers.id = data.producer_id
INNER JOIN (
SELECT producer_id, MAX(date) AS date
FROM data
GROUP BY producer_id
) AS max USING (producer_id, date)
结果table是:
----------------------------------------------------
| producer_id | max_date |
----------------------------------------------------
| 5 | 2022-01-01 01:45:00.000 +0000 |
| 7 | 2022-01-01 01:45:00.000 +0000 |
| 14 | 2022-01-01 01:45:00.000 +0000 |
| 15 | 2022-01-01 01:45:00.000 +0000 |
| 17 | 2022-01-01 01:45:00.000 +0000 |
----------------------------------------------------
接下来我需要的是 SUM
每个生产者的所有 data
记录 WITH date
大于 max_date
我们在上一个查询的 INNER JOIN
之后为每个生产者获得了。 SUM()
将在列 value
上执行。
希望这很清楚,如果不清楚,请告诉我。我试过做另一个 INNER JOIN
并在 WHERE
子句中使用 table max
但是我得到一个错误告诉我 table 在那里,但是无法在该部分查询中使用。
也许另一个 INNER JOIN
不是解决方案。在这里,我受到 SQL 知识的限制,我真的不知道应该阅读哪些关键字 in-depth 以了解什么是最好的方法以及如何去做。因此,将我重定向到最佳路径的信息真的很有帮助。
提前致谢。
编辑:忘记指定 SUM()
将在哪一列执行。
编辑 2:刚刚意识到我在这里要问的是,结果将始终为空 table,因为永远不会有 date
更大的记录。当我写我的数据库的简化版本时,忘记添加一个table/join,这就是原因。但最终 approach/solution 仍然是相同的,只是应用于不同的 table。再次抱歉。
问题中的第一个查询可以使用 distinct on
和 order by
大大简化:
select distinct on (p.id)
p.id, d.date
from producers p
join data d on p.id = d.producer_id
order by p.id, d.date desc;
至于“将每个生产者的所有数据记录与日期大于 max_date 相加”——好吧,none 存在日期大于最新的。这是一个这样做的查询(即使结果将是空的)
select producer_id, sum(value)
from data d inner join -- the query above follows
(
select distinct on (p.id)
p.id producer_id, d.date
from producers p
join data d on p.id = d.producer_id
order by p.id, d.date desc
) t using (producer_id)
where d.date > t.date
group by producer_id;