2011-06-10 107 views
-1

我有一個查詢,如下所示:修改MySQL查詢,消除重複

SELECT * FROM 
    (SELECT * FROM persons ORDER BY date DESC) AS p 
GROUP BY first_name,last_name,work_phone 

如果您還沒有想通了已經,這消除了與重複的姓名和工作電話號碼條目,只留下最近的。在人表中您應該瞭解另一個字段,稱爲DELETED的二進制字段。

問題是,如果有這種性質的重複,我不希望一個行被視爲如果它的DELETED值是TRUE,無論它的日期值是多近。但是,如果某行沒有重複項,則應將其包含在結果中,而不管其具有的是DELETED值。

如果存在重複項,則永遠不會有所有重複項都具有DELETED = TRUE的情況,至少有一項不會被刪除。

+0

難道你實際上已經張貼的SQL運行?我期望它會抱怨,因爲'SELECT *'包含不在'GROUP BY'子句中的字段。 – 2011-06-10 16:02:28

+0

@Don,它在MySQL中運行,你在談論MSSQL,PostgreSQL或那些東西。 – Johan 2011-06-10 16:06:36

+0

是的,查詢運行良好,我目前正在使用它。 – Yottagray 2011-06-10 16:12:00

回答

2
SELECT * FROM 
    (SELECT * FROM persons ORDER BY deleted ASC, date DESC) AS p 
GROUP BY first_name,last_name,work_phone 
+0

根據[MySQL文檔](http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html),它看起來像這個查詢是合法的,但結果是不定。依賴當前的MySQL分組實現是一個好主意嗎? – 2011-06-10 16:51:22

+0

@唐,是的。你可以通過服務器設置禁用這個所謂的實現細節,但它是MySQL的一部分,它不會消失。 – Johan 2011-06-10 16:57:12

+0

@Don和**這個**查詢的結果不是不確定的。 – Johan 2011-06-10 16:58:23

0

這就是我所理解的問題:

  1. 你有persons表的字段first_namelast_namework_phonedeleted,和一堆別人的。
  2. 任何具有相同姓氏和名字的記錄以及工作電話都應被視爲重複記錄。
  3. 應該使用最新的未刪除副本,或者只是最新的,如果他們全部被刪除。

這裏是我將如何處理這個問題的草圖:

  1. 在子查詢中選擇不同的名字,姓氏,和work_phone值。
  2. 左連接到另一個子查詢中每個組合的最新未刪除記錄。
  3. 將第三個子查詢中的每個組合的最新記錄左連接。
  4. 使用​​3210從第二或第三子查詢,取不爲空拉出值..