我有一个旧的数据库从一个废弃的"Joomgalaxy“Joomla插件的条目。
有三个表,joomgalaxy_entries、joomgalaxy_fields和joomgalaxy_entries_data
来自entries表的entries与entries_data表中的entry_id匹配,但实际字段名保存在另一个表fields中。
有人能帮我使用正确的SQL语句来获得如下终极目标中的结果吗?我的MySQL知识是非常基本的,从我的搜索中听起来我需要使用一个左联接,但是我不知道如何使用来自field_name的值作为返回值的列名。
谢谢!!
joomgalaxy_entries
---------------------------------------
| id | title | longitude | latitude |
---------------------------------------
| 50 | John | -79.333333 | 43.669999 |
| 51 | Bob | -79.333333 | 43.669999 |
---------------------------------------joomgalaxy_fields
为了保持简单,下面只是两个例子,不仅仅是这两个例子,所以它必须能够动态地使用field_name作为列名。
--------------------------------
| id | field_type | field_name |
--------------------------------
| 1 | textbox | websiteurl |
| 2 | dropdown | occupation |
--------------------------------joomgalaxy_entries_data
“技术上”不应该有任何重复的条目(fieldid和entry_id),所以根据我的理解,不应该影响使用上面的field_name作为列名,但是如果最终有一个条目呢?
-------------------------------------
| fieldid | field_value | entry_id |
-------------------------------------
| 1 | google.com | 50 |
| 2 | unemployed | 50 |
| 1 | doctor.com | 51 |
| 2 | doctor | 51 |
-------------------------------------终极目标
最后,尝试获得这种结果,因此我可以在MySQL工作台中使用该语句导出如下所示的数据:
------------------------------------------------------------------
| id | title | longitude | latitude | websiteurl | occupation |
------------------------------------------------------------------
| 50 | John | -79.333333 | 43.669999 | google.com | unemployed |
| 51 | Bob | -79.333333 | 43.669999 | doctor.com | doctor |
------------------------------------------------------------------编辑:不仅仅是两个字段( websiteurl和occupation ),我只是以这两个字段为例,有许多不同的字段,因此理论上从field_name中提取值将用于列名。
发布于 2017-05-09 22:03:22
您可以使用一些条件逻辑(如CASE语句)和聚合函数(如max()或min() )将这些值作为列返回:
SELECT je.id,
je.title,
je.longitude,
je.latitude,
max(case when jf.fieldid = 1 then jed.field_value end) as WebsiteUrl,
max(case when jf.fieldid = 2 then jed.field_value end) as Occupation
FROM joomgalaxy_entries je
INNER JOIN joomgalaxy_entries_data jed
on je.id = jed.entry_id
GROUP BY je.id,
je.title,
je.longitude,
je.latitude使用内部联接只会返回每个表中有值的joomgalaxy_entries行,如果希望返回所有joomgalaxy_entries,即使其他表中没有匹配的行可连接,则将内部联接更改为左联接。
https://stackoverflow.com/questions/43880525
复制相似问题