只需要对查询中的特定行进行分组 请考虑以下简化的MySQL表: id | docID | docTypeID | makeID | desc 1 | 1 | 1 | 1 | doc 1 2 | 1 | 1 | 2 | doc 2 3 | 2 | 2 | 1 | doc 3 4 | 3 | 3 | 2 | doc 4 5 | 1 | 1 | 4 | doc 5 6 | 2 | 2 | 5 | doc 6 7 | 4 | 1 | 1 | doc 7
在本例中,docID、docTypeID和makeID都是外键 当docTypeID为1的文档与多个make关联时,我需要将这些文档分组,并返回一个特殊的make描述(“找到多个make”) 对于这个示例表,我需要返回的是:只需要对查询中的特定行进行分组 请考虑以下简化的MySQL表: id | docID | docTypeID | makeID | desc 1 | 1 | 1 | 1 | doc 1 2 | 1 | 1 | 2 | doc 2 3 | 2 | 2 | 1 | doc 3 4 | 3 | 3 | 2 | doc 4 5 | 1 | 1 | 4 | doc 5 6 | 2 | 2 | 5 | doc 6 7 | 4 | 1 | 1 | doc 7,mysql,sql,Mysql,Sql,在本例中,docID、docTypeID和makeID都是外键 当docTypeID为1的文档与多个make关联时,我需要将这些文档分组,并返回一个特殊的make描述(“找到多个make”) 对于这个示例表,我需要返回的是: id | docID | docTypeID | makeID | desc 1 | 1 | 1 | multiple makes found | doc 1 3 | 2 | 2
id | docID | docTypeID | makeID | desc
1 | 1 | 1 | multiple makes found | doc 1
3 | 2 | 2 | 1 | doc 3
4 | 3 | 3 | 2 | doc 4
6 | 2 | 2 | 5 | doc 6
7 | 4 | 1 | 1 | doc 7
注意,在id 7的情况下,只找到一个make,因此没有执行分组
我不确定如何根据标准限制分组,或者这是否可能。我希望这里的一位SQL天才能够提供帮助。如果需要其他信息,请告诉我。谢谢。试试:
Select id, DocId, DocTypeId,
Case MakeCount When 1 Then MakeId
Else 'multiple makes found' End MakeId,
Desc
From (Select Min(id) Id, DocId, DocTypeId,
Count(Distinct MakeId) MakeCount,
Min(MakeId) MakeId, Min(desc) Desc
From TableName
Group By DocId, DocTypeId)
尝试:
你可以写:
SELECT MIN(id) AS id,
docID,
docTypeID,
CASE WHEN COUNT(1) > 1
THEN 'multiple makes found'
ELSE MIN(makeID)
END AS makeID,
MIN(desc) AS desc
FROM simplified_mysql_table
GROUP
BY docID,
docTypeID
CASE WHEN docTypeID = 1
THEN 0
ELSE id
END
;
(注意,MIN(id)
和MIN(desc)
可能不是来自同一个底层记录。如果这是一个问题,那么您需要稍微调整上面的内容。)您可以编写:
SELECT MIN(id) AS id,
docID,
docTypeID,
CASE WHEN COUNT(1) > 1
THEN 'multiple makes found'
ELSE MIN(makeID)
END AS makeID,
MIN(desc) AS desc
FROM simplified_mysql_table
GROUP
BY docID,
docTypeID
CASE WHEN docTypeID = 1
THEN 0
ELSE id
END
;
(注意,
MIN(id)
和MIN(desc)
可能不是来自同一个底层记录。如果这是一个问题,那么您需要稍微调整上面的内容。)一个简单的分组方式,如:
select min(id),docID,docTypeID,
case when count(1) > 1 then 'multiple makes found' else min(makeID) end AS makeID,
min(`desc`)
from docs_table group by docID,docTypeID;
我应该这样做。假设doc 6
和doc 3
处于相同的情况。
通过。一个简单的分组验证,如:
select min(id),docID,docTypeID,
case when count(1) > 1 then 'multiple makes found' else min(makeID) end AS makeID,
min(`desc`)
from docs_table group by docID,docTypeID;
我应该这样做。假设doc 6
和doc 3
处于相同的情况。
通过验证。向我们展示您决定如何返回
id=1
而不是2
或5
?仅针对doctype=1?id 3和id 6具有相同的doctype但不同的makeid。为什么在这种情况下两者都要?@eggyal:分组时应该返回min(id)。@nawful:doctype 1是唯一应该分组的时间。由于3和6是doctype 2,因此它们被排除在分组之外。请告诉我们您是如何决定返回id=1
而不是2
或5
?仅针对doctype=1?id 3和id 6具有相同的doctype但不同的makeid。为什么在这种情况下两者都要?@eggyal:分组时应该返回min(id)。@nawful:doctype 1是唯一应该分组的时间。由于3和6是doctype 2,它们被排除在分组之外。Min(id)
,Min(MakeId)
和Min(desc)
都可能与不同的记录相关。Min(id)
,Min(MakeId)
和Min(desc)
都可能与不同的记录相关。@eggyal谢谢,我知道这一点,但在他的情况下,我不确定这是否重要,请看我的更新答案。好的,在这种情况下,min(id)
和min(desc)
可能与不同的记录有关(这可能重要,也可能不重要:不清楚OP的要求是什么)。@eggyal谢谢,我知道这一点,但在他的情况下,我不确定这是否重要,无论如何,请看我的更新答案。好的,在这种情况下,min(id)
和min(desc)
可能与不同的记录有关(这可能重要,也可能不重要:OP的要求不清楚)。