2016-12-15 65 views
1

我正在尋找的東西喬納森在這個例子中搜索正好相反:MySQL的:選擇行兩三個主鍵

How to select multiple rows by multi-column primary key in MySQL?

有3列作爲主鍵(3日是日期),我想選擇沒有最近的一個。如果沒有第二個條目組合前兩個主要值,我根本不想選擇它。把它看作是一種版本控制。表結構包含比這三個更多的列,我想選擇整個行。

看起來就像這樣:

{ID1 | ID2 | DATE} | more columns ... 

僞代碼:

SELECT * FROM table WHERE (first and second primary value are the same and exist more than once) AND NOT MAX(date) 

:d

我要輸出的行的所有先前版本的數據,不包括最近一。

在此先感謝您的任何建議!

回答

1

分解問題轉化步驟:

僞邏輯:

  • 獲取我們想要排除
  • 現在排除整個組數據集記錄的數據集

步驟1:獲取僅具有ID1的最大數據的那些記錄的數據集,ID2

SELECT ID1, ID2, Max(date) date 
      FROM Table 
      GROUP BY ID1, ID2 

第2步:現在使用該數據集來識別/消除您不想要的記錄..不存在可能是最快的。

更快...

SELECT A.* 
FROM TABLE A 
WHERE NOT EXISTS 
(SELECT 1 
FROM (SELECT ID1, ID2, Max(date) date 
     FROM Table 
     GROUP BY ID1, ID2) B 
WHERE A.ID1 = B.ID1 
    and A.ID2 = B.ID2 
    and A.Date = B.Date) 

或自外連接的一個子集,速度較慢,但​​給人如果需要的話您可以訪問其他詳細信息子集。 (在這個例子中沒有太多用處,但在其他情況下可能有用)

數據集的左連接顯示那些匹配最大日期的數據集,所以其他所有記錄都將爲null,這是數據集,重新...

SELECT A.* 
FROM TABLE A 
LEFT JOIN (SELECT ID1, ID2, Max(date) date 
      FROM Table 
      GROUP BY ID1, ID2) B 
    on A.ID1 = B.ID1 
and A.ID2 = B.ID2 
and A.Date = B.Date 
WHERE B.ID1 is null 
+0

哇,這很快!很好解釋和工作! :) –

+0

由於不能編輯我自己的評論,這裏是第二個:哇,這很快!很好解釋和工作! :)第一個給我的是我正在搜索的內容,第二個帶有左連接的列將NULL添加到我的數據集中,這可能干擾真實數據,不是嗎?你錯過了一個關閉 - >(< - 在你的第一個解決方案的最後:) –

+0

第二個我們可以使用A. *而不是*和空列消失。並在缺失處添加)空列不會干擾,但基於連接標準和where子句,它們始終爲空。如此毫無意義,這就是爲什麼我添加A. *。請記住,我沒有數據集,所以我們沒有機會「測試」,除非我們模擬數據。 – xQbert