[英](SQL) Selecting from a database based on multiple pairs of pairs
我遇到的問題是嘗試從數據庫中選擇行,其中該行中的2列與特定的數據對對齊。 換句話說,從id = 1 AND type = 'news'
數據中選擇行。 顯然,如果只有1個簡單對,那將很容易,但是問題是我們要基於數百對數據選擇行。 我覺得好像必須有某種方法可以執行此查詢,而不必循環遍歷這些對,也不必分別查詢每個對。 我希望一些SQL堆棧器可以提供指導。
以下是完整的代碼細分:
假設我有以下數據集,其中history_id
是主鍵。 (為了便於閱讀,我對日期進行了一些簡化。)
table: history
history_id id type user_id date
1 1 news 1 5/1
2 1 news 1 5/1
3 1 photo 1 5/2
4 3 news 1 5/3
5 4 news 1 5/3
6 1 news 1 5/4
7 2 photo 1 5/4
8 2 photo 1 5/5
如果用戶想根據日期范圍從數據庫中選擇行,我們將獲取該數據的子集:
SELECT history_id, id, type, user_id, date
FROM history
WHERE date BETWEEN '5/3' AND '5/5'
它返回以下數據集:
history_id id type user_id date
4 3 news 1 5/3
5 4 news 1 5/3
6 1 news 1 5/4
7 2 photo 1 5/4
8 2 photo 1 5/5
現在,使用該數據子集,我需要確定每種類型/ id配對中有多少個條目代表數據庫中的第一個條目。 換句話說,第4行是數據庫中第一次id: 3
, type: news
出現嗎? 所以我用一個with()
min()
查詢。
在實際代碼中,這兩個列表是根據先前查詢的結果集以編程方式生成的。 (在這里我將它們拼寫清楚以便於閱讀。)
WITH previous AS (
SELECT history_id, id, type
FROM history
WHERE id IN (1,2,3,4) AND type IN ('news','photo')
) SELECT min(history_id) as history_id, id, type
FROM previous
GROUP BY id, type
它返回以下數據集:
history_id id type user_id date
1 1 news 1 5/1
2 1 news 1 5/1
3 1 photo 1 5/2
4 3 news 1 5/3
5 4 news 1 5/3
6 1 news 1 5/4
7 2 photo 1 5/4
8 2 photo 1 5/5
您會注意到它是整個原始數據集,因為我們在列表中逐個匹配id和type,而不是將其作為集合對。
我想要的結果是這樣,但是我無法弄清楚SQL來得到這個結果:
history_id id type user_id date
1 1 news 1 5/1
4 3 news 1 5/3
5 4 news 1 5/3
7 2 photo 1 5/4
顯然,我可以遍歷每一對並查詢數據庫以確定其第一個結果,但這似乎是一種無效的解決方案。 我認為此站點上的一位SQL專家可能能夠傳播一些智慧。
萬一我錯誤地處理了這種情況,整個例程的要旨是數據庫將所有創建和編輯存儲在同一張表中。 我需要跟蹤每個用戶的行為,並確定歷史記錄表中有多少條目是在特定日期范圍內的編輯或創建。 因此,我基於user_id
從日期范圍中選擇所有type:id
對,然后針對每個配對確定用戶是否對數據庫中發生的第一條記錄負責。 如果是第一個,則為“創建”,否則為“編輯”。
看不到需要兩個查詢... DVK的想法正確:
select id, type, MIN(date) as 'min_date'
from history
where date between YOUR_START_DATE and YOUR_END_DATE
group by id, type
SELECT *
FROM HISTORY,
(SELECT MIN(date) 'min_date', id, type
FROM history
WHERE id IN (1,2,3,4) AND type IN ('news','photo')
-- AND DATE BETWEEN xxx and YYY
GROUP BY id, type) 'min_dates'
WHERE HISTORY.id = min_dates.id
AND HISTORY.type = min_dates.type
AND HISTORY.date = min_dates.min_date
尚未對此進行測試,因為我目前沒有數據庫訪問權限,對不起
SELECT
h1.history_id,
h1.id,
h1.type,
h1.user_id,
h1.date
FROM
( select
h2.id,
MIN( h2.history_id ) minHistory
from
history h2
group by
h2.id ) ByType,
history h1
where
ByType.MinHistory = h1.History_ID
這將查詢整個系統的整個日期,而不考慮日期。 但是,您可以在內部查詢“ from History h2”中使用WHERE條件來限制日期范圍或id類型或類型描述。
由於內部查詢將首先完成,並且顯然會有較少的記錄,因此將其用作加入FULL歷史記錄表的主要記錄。 但是,由於它僅基於單個History ID記錄,因此只有您希望獲得的關鍵記錄才是“ First”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.