MySQL:仅按一行选择具有特定条件的分组

MySQL:仅按一行选择具有特定条件的分组,mysql,group-by,Mysql,Group By,我有一个包含文档的表格,其中每个文档都有一个doc\u id,但在相同的日期,对于相同的case\u 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

我有一个包含文档的表格,其中每个文档都有一个
doc\u id
,但在相同的
日期
,对于相同的
case\u 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
我要做的是根据
案例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 -- 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是最优雅、最直截了当的。
我最初接受了格尔凯姆的答案,但出于某种原因,它返回了草莓指出的一个错误结果。因此,草莓的答案是最优雅、最正确的

如果某些研究需要此SQL,那么有一种方法可以获得预期的结果集:

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
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

如果某些研究需要此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

这可能会起作用,但依赖于未记录的黑客(除非您将手册的注释部分计算在内)。我认为最好还是坚持使用有文档记录的解决方案。这是否有效,因为您按语言排序,然后按
分组
隐式地从语言顺序中选择第一项?这可能有效,但依赖于未文档记录的黑客(除非您计算手册的注释部分)。我认为最好还是坚持使用有文档记录的解决方案。这是否有效,因为您按语言排序,然后
分组
隐式地从语言顺序中选择第一项?使用
max
的绝妙技巧,并在聚合中引入
case
的逻辑,以选择满足特定条件的行criteria@YannisP. 所以它返回一个不正确的结果(72756)并不重要!是的,但为什么你认为它会返回一个错误?@YannisP。因为除非我大错特错,否则您需要我的查询返回的结果集;-)@扬尼斯普。因为,对于每一个case\u id,它都返回一个任意的doc\u id。当它发生时,MySQL会在每一个case\u id中选择最低的索引id。使用
max
的好技巧,并在聚合中引入
case
的逻辑,以选择满足特定条件的行criteria@YannisP. 所以它返回一个不正确的结果(72756)并不重要!是的,但为什么你认为它会返回一个错误?@YannisP。因为除非我大错特错,否则您需要我的查询返回的结果集;-)@扬尼斯普。因为,对于每一个case\u id,它都返回一个任意的doc\u id。当它发生时,MySQL在每一个case\u id中选择最低的索引id。很好的一个@草莓!漂亮的草莓!
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';