所以我一直在阅读有关动态行到列的其他一些问题。通过在另一个答案中调整另一个查询在这里
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将行输出到列中,但有两件事我无法弄清楚:
有谁知道如何产生预期效果?
编辑1:我忘了说结果必须列出所有汽车是否有库存骰子。
编辑2:我应该澄清一下,NUMBER表示产品编号而非计数。这是一个字符串字段,可以包含多个产品编号。这是遗留数据。
答案 0 :(得分:0)
试试这个:
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;