请考虑以下简化的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的doc与多个品牌相关联时,我需要将这些文档组合在一起并返回特殊的品牌描述('multiple makes found')。
我需要为此示例表返回的内容是:
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天才之一可以提供帮助。如果需要任何其他信息,请告诉我。感谢。
答案 0 :(得分:3)
你可以写:
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
;
(N.B。MIN(id)
和MIN(desc)
可能不会来自相同的基础记录。如果这是一个问题,那么您需要稍微调整一下。)
答案 1 :(得分: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
处于相同的情况。
使用sqlFiddle验证。
答案 2 :(得分:0)
尝试:
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)