Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 复杂的查询-包含分组列的表很少_Mysql_Sql - Fatal编程技术网

Mysql 复杂的查询-包含分组列的表很少

Mysql 复杂的查询-包含分组列的表很少,mysql,sql,Mysql,Sql,我有桌子: Worker (ID, Name) Box (ID, Name, ID_Worker) BoxColor (ID, Name) BoxSize (ID, Name) Item(ID, ID_box, ID_BoxColor, ID_BoxSize) 因此,我们有工人创建物品并将其放入箱子中。 为了我的秘密工作,我改变了话题,从我的秘密变成了ehm盒子;) 我正在尝试创建具有列的raport: Worker.Name | BoxSize.Name | BoxColor(id=0

我有桌子:

Worker (ID, Name)

Box (ID, Name, ID_Worker)

BoxColor (ID, Name)
BoxSize (ID, Name)

Item(ID, ID_box, ID_BoxColor, ID_BoxSize)
因此,我们有工人创建物品并将其放入箱子中。 为了我的秘密工作,我改变了话题,从我的秘密变成了ehm盒子;)

我正在尝试创建具有列的raport:

Worker.Name | BoxSize.Name | BoxColor(id=0) | BoxColor(id=1) | BoxColor(id=2)
表框用于其他端口,因此表的这种结构不能改变

例如,我想要得到的是:

分组的工人姓名和每个盒子大小,在列中包含每个颜色计数。 例如:

John | X   | 2 | 4 | 0 |
John | XL  | 5 | 1 | 0 |
John | XXL | 2 | 0 | 0 |
John | S   | 3 | 1 | 0 |
Adam | X   | 5 | 4 | 0 |
Adam | XL  | 1 | 3 | 0 |
Adam | S   | 0 | 1 | 0 |
....
BoxColor是一个没有太多颜色的表,因此可以使用不同的子选项对其进行硬编码,如

(select count(*) from BoxColor where ID = 0)
(select count(*) from BoxColor where ID = 1)
(select count(*) from BoxColor where ID = 2)
我试着这样做,但查询是循环的,它从未停止“思考”


也许是这样的:

SELECT
    Worker.Name,
    BoxSize.Name,
    SUM(CASE WHEN BoxColor.id=0 THEN 1 ELSE 0 END) AS BoxColor_0,
    SUM(CASE WHEN BoxColor.id=1 THEN 1 ELSE 0 END) AS BoxColor_1,
    SUM(CASE WHEN BoxColor.id=2 THEN 1 ELSE 0 END) AS BoxColor_2    
FROM
    Worker
    JOIN Box
        ON Worker.ID=Box.ID_Worker
    JOIN Item
        ON Item.ID_box=Box.ID
    JOIN BoxColor
        ON BoxColor.ID=Item.ID_BoxColor
    JOIN BoxSize
        ON BoxSize.ID=Item.ID_BoxSize
GROUP BY
    Worker.Name,
    BoxSize.Name

考虑在应用程序级代码/表示层中处理数据显示的问题,如果你有一个(例如简单的PHP循环),我不能这样做,因为在我的Web应用程序中,我做了灵活的添加新报告的方法。还有很多其他报表,因此我无法为一个报表创建特定的界面:)
SELECT
    Worker.Name,
    BoxSize.Name,
    SUM(CASE WHEN BoxColor.id=0 THEN 1 ELSE 0 END) AS BoxColor_0,
    SUM(CASE WHEN BoxColor.id=1 THEN 1 ELSE 0 END) AS BoxColor_1,
    SUM(CASE WHEN BoxColor.id=2 THEN 1 ELSE 0 END) AS BoxColor_2    
FROM
    Worker
    JOIN Box
        ON Worker.ID=Box.ID_Worker
    JOIN Item
        ON Item.ID_box=Box.ID
    JOIN BoxColor
        ON BoxColor.ID=Item.ID_BoxColor
    JOIN BoxSize
        ON BoxSize.ID=Item.ID_BoxSize
GROUP BY
    Worker.Name,
    BoxSize.Name