[英]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.