0

因此,我一直在阅读有关动态行到列的其他一些问题。通过在此处的另一个答案中调整另一个查询

mysql 选择动态行值作为列名,将另一列作为值

我可以让它适用于单个表,但是我还需要从其他两个表中提取记录以包含在结果中。鉴于这些表:

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 and Dice 中的行数将是动态的,因此不能硬编码。我可以让 Dice 将行输出到列中,但有两件事我无法弄清楚:

  • 主查询应该列出 Cars 表中的所有列以及所有行作为 Dice 表中的列,但我不知道如何将 Dice 查询附加到 Cars 查询。
  • 我需要从 Dice 表中提取相关描述以用作列标题。使用 dice.id 既不实用也没有帮助。我不知道如何将其合并到我对 Dice 表的工作查询中。

有谁知道如何产生预期的结果?

编辑 1:我忘了说结果必须列出所有汽车,无论它们是否有 Dice 库存。

编辑 2:我应该澄清 NUMBER 是指产品编号而不是计数。这是一个可以保存多个产品编号的字符串字段。这是遗留数据。

4

1 回答 1

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;
于 2013-09-07T05:40:29.813 回答