簡體   English   中英

(SQL)基於多對對從數據庫中選擇

[英](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: 3type: 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.

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