0

请考虑以下简化的 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 的文档与多个品牌相关联时,我需要将这些文档组合在一起并返回一个特殊的品牌描述(“找到多个品牌”)。

我需要为这个示例表返回的是:

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 天才可以提供帮助。如果需要任何其他信息,请告诉我。谢谢。

4

3 回答 3

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
;

(注意MIN(id)andMIN(desc)可能不是来自相同的基础记录。如果这是一个问题,那么您需要稍微调整一下上面的内容。)

于 2012-11-02T15:38:59.887 回答
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验证。

于 2012-11-02T15:39:12.240 回答
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)
于 2012-11-02T15:37:42.930 回答