简体   繁体   English

PHP PDO为MySQL查询正确使用JOINS

[英]PHP PDO Correct use of JOINS for mySQL query

How would one correctly use a JOIN to add each row that matches the ID from a second table in as a column header of the first table. 如何正确使用JOIN将与第二个表中的ID匹配的每一行添加为第一个表的列标题。

Example. 例。

THEME TABLE 主题表

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

THEME_META Table THEME_META

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

MySQL query would then be SELECT * FROM theme WHERE date = ? MySQL查询将是SELECT * FROM theme WHERE date = ?

I would then have foreached my results and have my theme item in a variable which I can use to echo the value for any column in the row. 然后,我会预先列出结果,并将主题项放在一个变量中,该变量可用于回显该行中任何列的值。

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

How would I also be able via a JOIN to be able to echo 我还如何通过JOIN能够回显

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

What you are looking for is pivot the column field in the theme_meta table for each refID , unfortunatly, MySQL doesn't have the pivot table operator, but you can use the CASE expression to do so: 您要查找的是为每个refID 旋转 theme_meta表中的列field ,不幸的是,MySQL没有透视表运算符,但是您可以使用CASE表达式来实现:

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;

Update: To do this dynamically instead of listing the values manually, you have to use dynamic sql, like this: 更新:若要动态执行此操作,而不是手动列出值,则必须使用动态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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM