因此,我一直在阅读有关动态行到列的其他一些问题。通过在此处的另一个答案中适应另一个查询
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/

10-10 06:55