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