簡體   English   中英

SQL根據另一列中的值從一列中選擇值

[英]SQL select value from one column based on values in another column

我有兩張桌子。 一個存儲“位置”:

TABLE location (
    ID               serial             PRIMARY KEY,
    name             text               NOT NULL,
    description      text               NOT NULL
);

每個位置都有許多行“數據”:

TABLE data(
    ID               smallint           REFERENCES location(ID),
    date             date,               
    rainfall         int                
);

我想找到所有具有給定時間段內“數據”的位置。 我已經試過了:

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;

但似乎將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;

當你說跨越一定時期內,為什么不使用between像下面

SELECT location.ID, location.name FROM location location
JOIN data d ON d.id = location.id WHERE d.date between '$start_date' AND '$end_date' ORDER BY location.ID;

請注意,兩個日期都包含在內

您可以將查詢結果加入這些值,並在where條件中使用

SELECT location.ID, location.name FROM location                    
JOIN data ON data.id = location.id 
JOIN (
    SELECT MIN(date) AS _min,MAX(date) AS _max,id
    FROM data
    GROUP BY id
) T ON T.id = location.id
WHERE T._min <= '$start_date' AND T._max >= '$end_date' 
ORDER BY location.ID;

只是為了澄清-我理解您想獲取在那些時間跨度中具有data locations所有data (示例暗示這就是您想要的)

如果要獲取在該時間范圍內發生的所有data ,這不是您想要的解決方案,則需要@ jusermar10或@Yogs提供的between解決方案

您可以使用between子句獲得所需的結果

SELECT l.ID, l.name FROM location l                   
    inner JOIN data d ON d.id = l.id 
    WHERE  d.date between '$start_date' and '$end_date' group by l.id

當您說跨越給定時間段時,我想您的意思是僅輸出所有其data.date$start_date$end_date之間的位置。

在這種情況下,此查詢應該起作用:

SELECT location.ID, location.NAME FROM locations, data
WHERE locations.ID=data.ID
GROUP BY locations.ID
HAVING min(data.date) >= '$start_date' and max(data.date) <= $end_date;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM