使用mysql从多个表动态行到列

时间:2013-09-07 04:40:31

标签: mysql sql select dynamic group-concat

所以我一直在阅读有关动态行到列的其他一些问题。通过在另一个答案中调整另一个查询在这里

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表示产品编号而非计数。这是一个字符串字段,可以包含多个产品编号。这是遗留数据。

1 个答案:

答案 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;