因此,我一直在阅读有关动态行到列的其他一些问题。通过在此处的另一个答案中适应另一个查询
mysql select dynamic row values as column names, another column as value,
我可以将其用于单个表,但是我还需要从其他两个表中提取记录以包括在结果中。给定这些表:
Cars
ID BRAND NAME etc1...
1 gmc sierra
2 ford ranger
3 dodge dakota
4 kia rio
Dice
ID DESCRIPTION
1 blue
2 green
3 red
etc2. etc2.
Stock
ID CAR_ID DICE_ID NUMBER
1 1 3 01V,3Y6
2 3 1 8Z4
3 2 2 03X
4 1 1 C7B
所以是的,这没有多大意义,而只是显示结构。我的结果需要像这样出来:
CAR_ID BRAND NAME etc1. BLUE GREEN RED etc2.
1 gmc sierra ... C7B null 01V,3Y6 ...
2 ford ranger ... null 03X null ...
3 dodge dakota ... 8Z4 null null ...
4 kia rio ... null null null ...
如果它是静态的,则很简单,但是Cars和Dice中的行数将是动态的,因此不能进行硬编码。我可以让Dice将行输出到列中,但是有两件事我不知道:
主要查询应该列出Cars表中的所有列以及所有行作为Dice表中的列,但是我不知道如何将Dice查询附加到Cars查询。
我需要从Dice表中提取相对描述以用作列标题。使用dice.id不切实际或无用。我不知道如何将其合并到我对Dice表的工作查询中。
有谁知道如何产生期望的结果?
编辑1:我忘了说结果必须列出所有汽车,无论它们是否有骰子。
编辑2:我应该澄清NUMBER表示产品编号,而不是数量。这是一个字符串字段,可以容纳多个产品编号。它是旧数据。
最佳答案
尝试这个:
SET SESSION group_concat_max_len = 10000;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(D.ID = ',D.ID,', D.ID, NULL)) as \'', D.DESCRIPTION, '\'')) INTO @sql FROM Dice D;
SET @s = CONCAT('SELECT C.*, ', @sql, ' FROM Cars C INNER JOIN Stock S ON C.Id = S.Car_Id INNER JOIN Dice D ON S.DICE_ID = D.ID GROUP BY C.ID');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
关于mysql - 使用mysql从多个表向列动态行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18669776/