MySQL:在GROUP BY上选择只有一行具有特定条件

时间:2016-01-20 10:05:14

标签: mysql group-by

我有一张包含文档的表格,其中每个文档都有一个doc_iddate位于同一case_id我可能有两种不同的语言版本

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

我想要做的是按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?

更新

<德尔> 所有答案都给出了正确的结果,但我将Görkem标记为正确,因为IMO是最优雅和直截了当的原因。

我最初接受了Görkem的回答,但由于某种原因,它返回了一个草莓指出的错误结果。这使得Strawberry的答案成为最优雅和正确的答案

4 个答案:

答案 0 :(得分: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';

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:1)

SELECT 
  doc_id,
  case_id,
  date,
  lang,
  max(case lang when 'ENG' then 1 else 0 end)
FROM tbl
GROUP BY case_id