如何按类别分组,但根据最低内容订购类别?

时间:2014-12-18 15:49:03

标签: mysql

我有两个表:workTypesworkTypeCategories。 workTypes包含以下字段:

  • idWorkType
  • 代码
  • 姓名
  • idCategory

workTypeCategories包含以下字段:

  • idCategory
  • 姓名

workTypeCategory可以有多个workTypes作为子项。

表示:

  
      
  • workTypeCategory1
      
        
    • workType 1 Code 99
    •   
    • workType 2 Code 108
    •   
    • workType 3 Code 103
        ------------
    •   
  •   
  • workTypeCategory2
      
        
    • workType 4 Code 98
    •   
    • workType 5 Code 102
    •   
    • workType 6 Code 105
    •   
  •   

事情是:现在一切都按照workTypeCategory名称(ASC)排序。

我正在努力使其按照具有最低工作类型代码的类别进行排序,但按工作类型分类,因此同一类别仅显示一次,但类别的顺序取决于其最低工作类型代码。

以下是我现在所拥有的内容,它按代码排序但拆分类别,多次输出相同的类别(这不是我想要的)。

SELECT t.code
     , t.name
     , c.name 
  FROM worktypes t
  LEFT 
  JOIN worktypecategories c
    ON c.idWorkTypeCategory = t.idCategory 
 ORDER 
    BY t.code ASC
     , c.name ASC;

我想说清楚,我希望是。

我很确定这是一个相当简单的问题,但我缺乏MySQL知识使我无法找到解决方案。

修改

原始输出:

code    WorktypeCategory.name   worktypes.name
401     AAAAAAAA                ABC

100     BBBBBBBB                DEF
110     BBBBBBBB                FED
460     BBBBBBBB                LLL

090     CCCCCCCC                YYY
430     CCCCCCCC                ZZZ

实际输出:

code    WorktypeCategory.name   worktypes.name
090     CCCCCCCC                YYY

100     BBBBBBBB                DEF
110     BBBBBBBB                FED

401     AAAAAAAA                ABC

430     CCCCCCCC                ZZZ

460     BBBBBBBB                LLL

期望的输出:

code    WorktypeCategory.name   worktypes.name
090     CCCCCCCC                YYY
430     CCCCCCCC                ZZZ

100     BBBBBBBB                DEF
110     BBBBBBBB                FED
460     BBBBBBBB                LLL

401     AAAAAAAA                ABC

编辑2

以下是SQL Fiddle,您可以看到实际代码列出了具有类别名称的工作类型,但它们并未“分组”。我希望A类的所有工作类型都在一起,B,C等。但我希望根据最低工作类型代码列出这些类别。

所以现在它是(使用SQL Fiddle数据)
A(A类下的所有工作类型,按升序排列)
C(C类下的所有工作类型)
B(B类下的所有工作类型)
E(E类下的所有工作类型)
D(D类下的所有工作类型)

*现在正确*

| CODE |        NAME | CATEGORYNAME |
|------|-------------|--------------|
|  100 |      luctus |            A |
|  102 |   tristique |            A |
|  103 | scelerisque |            C |
|  111 |         sem |            C |
|  124 |       massa |            A |
|  202 |       Donec |            A |
|  300 |      varius |            B |
|  301 |      risus  |            E |
|  403 |  malesuada  |            C |
|  405 |    sagittis |            B |
|  503 |      Morbi  |            E |
|  701 |      augue  |            D |

*预期输出*

| CODE |        NAME | CATEGORYNAME |
|------|-------------|--------------|
|  100 |      luctus |            A |
|  102 |   tristique |            A |
|  124 |       massa |            A |
|  202 |       Donec |            A |
|  103 | scelerisque |            C |
|  111 |         sem |            C |
|  403 |  malesuada  |            C |
|  300 |      varius |            B |
|  405 |    sagittis |            B |
|  301 |      risus  |            E |
|  503 |      Morbi  |            E |
|  701 |      augue  |            D |

2 个答案:

答案 0 :(得分:1)

您的查询非常接近。问题是您按代码排序,那么类别名称。这意味着这些类别实际上不会被订购,因为代码是先订购的。

要实现您想要的效果,您应该按名称排序,然后按照代码在该组内订购,如下所示:

ORDER BY worktypecategories.name ASC, MIN(w1.code) ASC

这是您的Fiddle返回更新。

修改

我对以下内容所做的是编写一个子查询,它获得了我们想要的类别名称的顺序(它按照你的说法返回了A,C,B,E,D),然后只是加入了上面的查询和有效。这是更新的Fiddle

SELECT t1.code, t1.name, t1.categoryName
FROM(
  SELECT w1.code, w1.name, worktypecategories.name AS categoryName
  FROM worktypecategories 
  LEFT JOIN worktypes w1 ON worktypecategories.idWorkTypeCategory = w1.idCategory 
  LEFT JOIN worktypes w2 ON worktypecategories.idWorkTypeCategory = w2.idCategory 
  GROUP BY w1.idWorkType
  ORDER BY worktypecategories.name ASC, MIN(w1.code) ASC) t1
  RIGHT JOIN(SELECT categoryname
  FROM(
    SELECT w1.code, w1.name, worktypecategories.name AS categoryName
    FROM worktypecategories 
    LEFT JOIN worktypes w1 ON worktypecategories.idWorkTypeCategory = w1.idCategory 
    LEFT JOIN worktypes w2 ON worktypecategories.idWorkTypeCategory = w2.idCategory 
    GROUP BY w1.idWorkType
    ORDER BY worktypecategories.name ASC, MIN(w1.code) ASC) t
    GROUP BY categoryName
  ORDER BY MIN(code) ASC) t2 ON t1.categoryName = t2.categoryName;

答案 1 :(得分:0)

<强> EDITED

我认为这就是你想要的:

SELECT *
FROM worktypecategories 
LEFT JOIN worktypes w1 ON worktypecategories.idWorkTypeCategory = w1.idCategory 
LEFT JOIN worktypes w2 ON worktypecategories.idWorkTypeCategory = w2.idCategory 
GROUP BY w1.id
ORDER BY MIN(w1.code) ASC, worktypecategories.name ASC

我只是加入了两次,并将其中一个分组,以获得较低的代码作为汇总结果。