首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自多个表的MySQL联接语句

来自多个表的MySQL联接语句
EN

Stack Overflow用户
提问于 2017-05-09 21:57:09
回答 5查看 349关注 0票数 0

我有一个旧的数据库从一个废弃的"Joomgalaxy“Joomla插件的条目。

有三个表,joomgalaxy_entriesjoomgalaxy_fieldsjoomgalaxy_entries_data

来自entries表的entriesentries_data表中的entry_id匹配,但实际字段名保存在另一个表fields中。

有人能帮我使用正确的SQL语句来获得如下终极目标中的结果吗?我的MySQL知识是非常基本的,从我的搜索中听起来我需要使用一个左联接,但是我不知道如何使用来自field_name的值作为返回值的列名。

谢谢!!

joomgalaxy_entries

代码语言:javascript
复制
---------------------------------------
| id | title | longitude | latitude   |
---------------------------------------
| 50  | John | -79.333333 | 43.669999 |
| 51  | Bob  | -79.333333 | 43.669999 |
---------------------------------------

joomgalaxy_fields

为了保持简单,下面只是两个例子,不仅仅是这两个例子,所以它必须能够动态地使用field_name作为列名。

代码语言:javascript
复制
--------------------------------
| id | field_type | field_name |
--------------------------------
| 1  | textbox    | websiteurl |
| 2  | dropdown   | occupation |
--------------------------------

joomgalaxy_entries_data

“技术上”不应该有任何重复的条目(fieldidentry_id),所以根据我的理解,不应该影响使用上面的field_name作为列名,但是如果最终有一个条目呢?

代码语言:javascript
复制
-------------------------------------
| fieldid | field_value | entry_id |
-------------------------------------
|   1     | google.com  |    50    | 
|   2     | unemployed  |    50    |
|   1     | doctor.com  |    51    | 
|   2     | doctor      |    51    |
-------------------------------------

终极目标

最后,尝试获得这种结果,因此我可以在MySQL工作台中使用该语句导出如下所示的数据:

代码语言:javascript
复制
------------------------------------------------------------------
| id | title | longitude  | latitude   | websiteurl | occupation |
------------------------------------------------------------------
| 50  | John | -79.333333 | 43.669999  | google.com | unemployed |
| 51  | Bob  | -79.333333 | 43.669999  | doctor.com | doctor     |
------------------------------------------------------------------

编辑:不仅仅是两个字段( websiteurloccupation ),我只是以这两个字段为例,有许多不同的字段,因此理论上从field_name中提取值将用于列名。

EN

Stack Overflow用户

发布于 2017-05-09 22:03:22

您可以使用一些条件逻辑(如CASE语句)和聚合函数(如max()min() )将这些值作为列返回:

代码语言:javascript
复制
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,即使其他表中没有匹配的行可连接,则将内部联接更改为左联接。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43880525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档