1

如何正确使用 JOIN 将与第二个表中的 ID 匹配的每一行添加为第一个表的列标题。

例子。

主题桌

ID     TITLE    DATE    TEXT
1     logo     23101    some sample text
2     back     23101    some sample text

THEME_META

refID     field     value
1         width     300
1         height    190
1         alt       some alternate text
2         bgcolor   #222

然后 MySQL 查询将是SELECT * FROM theme WHERE date = ?

然后我会计算我的结果并将我的主题项放在一个变量中,我可以用它来回显行中任何列的值。

例如。echo $theme['title'];

我如何也能够通过 JOIN 能够回显

$theme['width'] . $theme['height'] . $theme['alt']
4

1 回答 1

2

您正在寻找的是为 each 表中的列进行透视,不幸的是,MySQL 没有透视表运算符,但您可以使用表达式来执行此操作:fieldtheme_metarefIDCASE

SELECT
  t.id,
  t.date,
  t.text,
  MAX(CASE WHEN m.field = 'width' THEN m.value ELSE NULL END) AS Width,
  MAX(CASE WHEN m.field = 'height' THEN m.value ELSE NULL END) AS height,
  MAX(CASE WHEN m.field = 'alt' THEN m.value ELSE NULL END) AS alt, 
  MAX(CASE WHEN m.field = 'bgcolor' THEN m.value ELSE NULL END) AS bgcolor,
FROM theme AS t
INNER JOIN theme_meta AS m ON t.id = m.refID
GROUP BY t.id,
  t.date,
  t.text;

更新:要动态执行此操作而不是手动列出值,您必须使用动态 sql,如下所示:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(m.field  = ''',
      m.field, ''', m.value, NULL)) AS ', '''', m.field  , '''')
  ) INTO @sql
FROM theme_meta AS m;

SET @sql = CONCAT('SELECT t.id,t.date,t.text, ', 
                  @sql , '
    FROM theme AS t
INNER JOIN theme_meta AS m ON t.id = m.refID
GROUP BY t.id,
  t.date,
  t.text;');

prepare stmt 
FROM @sql;

execute stmt;
于 2013-09-30T12:00:10.070 回答