需要仅对查询中的特定行进行分组

时间:2012-11-02 15:28:40

标签: mysql sql

请考虑以下简化的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天才之一可以提供帮助。如果需要任何其他信息,请告诉我。感谢。

3 个答案:

答案 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 6doc 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)