Joh*_*ohn 2 sql postgresql join where-clause
我有两张桌子。一店“地点”:
TABLE location (
ID serial PRIMARY KEY,
name text NOT NULL,
description text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
每个位置都有许多行“数据”:
TABLE data(
ID smallint REFERENCES location(ID),
date date,
rainfall int
);
Run Code Online (Sandbox Code Playgroud)
我想找到在给定时期内具有“数据”的所有位置。我已经尝试过这个:
SELECT location.ID, location.name FROM location
JOIN data ON data.id = location.id
WHERE (SELECT MIN(data.date) FROM data) <= '$start_date'
AND
(SELECT MAX(data.date) FROM data) >= '$end_date'
ORDER BY location.ID;
Run Code Online (Sandbox Code Playgroud)
但它似乎将 MIN 和 MAX 测试应用于所有数据,而不是应用于每个单独的位置,即测试需要应用于每个位置,并且只返回通过测试的那些位置。
有什么建议么?
只需按位置聚合,然后断言子句中的最小值/最大值HAVING:
SELECT
l.ID,
l.name
FROM location l
INNER JOIN data d
ON d.id = l.id
GROUP BY
l.ID
HAVING
MIN(data.date) <= '$start_date' AND
MAX(data.date) >= '$end_date'
ORDER BY
l.ID;
Run Code Online (Sandbox Code Playgroud)