我有两个表:workTypes
和workTypeCategories
。
workTypes包含以下字段:
workTypeCategories包含以下字段:
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
以下是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 |
答案 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
我只是加入了两次,并将其中一个分组,以获得较低的代码作为汇总结果。