2016-01-20 29 views
0

我有文件的表格,其中每個文檔有一個doc_id,但在同一date爲同一case_id我可能有兩個不同的語言版本MySQL的:只有一個行一定的標準

doc_id  case_id  date  lang 
001-89259 1012/02  2008-11-04 FRA 
001-144945 10122/04 2014-06-19 ENG 
001-57558 10126/82 1988-06-21 ENG 
001-62116 10126/82 1988-06-21 FRA 
001-91708 10129/04 2009-03-10 FRA 
001-116955 10131/11 2013-03-07 FRA 
001-102676 10143/07 2011-01-11 FRA 
001-104520 10145/07 2011-04-12 FRA 
001-72756 10162/02 2006-03-09 FRA 
001-72757 10162/02 2006-03-09 ENG 
001-82198 10163/02 2007-09-06 ENG 
001-57555 10208/82 1988-05-26 ENG 
001-62113 10208/82 1988-05-26 FRA 
選擇在GROUP

我想要做的是根據case_iddate選擇英文版本,如果可用,請保留法文。然後我的輸出將如下所示:

doc_id  case_id  date  lang 
001-89259 1012/02  2008-11-04 FRA 
001-144945 10122/04 2014-06-19 ENG 
001-57558 10126/82 1988-06-21 ENG -- keep only the english version 
001-91708 10129/04 2009-03-10 FRA 
001-116955 10131/11 2013-03-07 FRA 
001-102676 10143/07 2011-01-11 FRA 
001-104520 10145/07 2011-04-12 FRA 
001-72757 10162/02 2006-03-09 ENG -- keep only the english version 
001-82198 10163/02 2007-09-06 ENG 
001-57555 10208/82 1988-05-26 ENG -- keep only the english version 

我該如何使用MySQL?

UPDATE:

所有答案給出正確的結果,但我打上Görkem的爲正確IMO是最優雅,最直接的是,爲什麼它的工作原理。

我最初接受了Görkem的回答,但由於某種原因,它返回了草莓指出的一個錯誤結果。這使得草莓的回答是最優雅的,正確的

回答

2
SELECT DISTINCT COALESCE(e.doc_id,f.doc_id) doc_id 
       , f.case_id 
       , f.date 
       , COALESCE(e.lang,f.lang) lang 
      FROM my_table f 
      LEFT 
      JOIN my_table e 
      ON e.case_id = f.case_id 
      AND e.date = f.date 
      AND e.lang = 'ENG'; 
+0

不錯的@Strawberry! –

1
SELECT 
     sorted.doc_id, 
     sorted.case_id, 
     sorted.date, 
     sorted.lang 
    FROM (
     SELECT 
       doc_id, 
       case_id, 
       date, 
       lang 
      FROM tbl 
      ORDER BY FIELD(lang, 'ENG', 'FRA') 
    ) sorted 
    GROUP BY sorted.case_id 
+0

這*可能*工作 - 但依賴於無證黑客(除非您計算手冊的註釋部分)。我認爲堅持一個有文件的解決方案可能會更好。 – Strawberry

+0

@Strawberry它的工作原理總是 – Deep

+0

它是否工作,因爲您按語言排序,然後'GROUP BY'隱式地從語言順序中選擇第一個項目? –

1

如果需要對一些研究這個SQL,還有一種方式來獲得預期的結果集:

Select SUBSTRING_INDEX(GROUP_CONCAT(doc_id ORDER BY lang), ',', 1) doc_id, case_id, date, SUBSTRING_INDEX(GROUP_CONCAT(lang ORDER BY lang), ',', 1) lang from table group by case_id,date 
1
SELECT 
    doc_id, 
    case_id, 
    date, 
    lang, 
    max(case lang when 'ENG' then 1 else 0 end) 
FROM tbl 
GROUP BY case_id 
+0

使用'max'的好方法,並且在彙總內部引入'case'邏輯來選擇符合特定條件的行 –

+0

歡迎您光臨。祝你好運! –

+0

@YannisP。所以沒關係,它返回一個不正確的結果(72756)? – Strawberry

相關問題