当一个表的行必须附加到result中的列时,MySQL JOIN

时间:2015-05-18 15:20:05

标签: mysql join

我有一个这种表格的表格,它可以记录事件的注册情况:

id|name|email|eventid

称之为t1

还有一个自定义字段表,用于为注册添加其他信息。自定义字段表是

id|customfield_name|customfield_value|parentid

称之为t2

因此,如果我有5个额外的自定义字段用于事件注册,对于t1中的单个注册,t2中将有5个单独的行。

parentid是指第一张表中的id。

如果我进行内部联接,就像这样,

SELECT t1.name, t2.customfield_value
FROM table1 t1
JOIN table2 t2
ON t2.parentid = t1.id
WHERE t1.eventid = 2 AND t2.customfield_name='some custom field'

然后结果还可以。我从t1看到了名字,并且从t2看到了一个自定义字段。但我希望能够将多个data_name显示为col。所以结果就像

name|custom field 1|custom field 2|etc

我无法弄清楚如何使用JOIN语法来完成此任务。我不熟悉MySQL,希望有人能指出我正确的方向。

编辑:

好草莓,这是sqlfiddle:

http://sqlfiddle.com/#!9/37172/1

如果加入一个自定义字段,结果几乎就是我要找的,除了我希望列标签是自定义字段的名称,而不是'值'。我试图弄清楚如何产生这个结果,这对应于注册表的连接,其中eventid = 2,以及与该eventid的注册相对应的自定义字段。所以期望的结果是

name  | workphone | mobile | nationality
Name1   112233      223344   US
Name2   334455      445566   DE

谢谢!

3 个答案:

答案 0 :(得分:1)

McAdam331的解决方案速度更快,但以下内容更清晰:

SELECT r.name
     , MAX(CASE WHEN c.customfield = 'workphone' THEN c.value END) workphone
     , MAX(CASE WHEN c.customfield = 'mobile' THEN c.value END) mobile
     , MAX(CASE WHEN c.customfield = 'nationality' THEN c.value END) nationality
  FROM registrations r
  JOIN customfields c
    ON c.parentid = r.id
 WHERE r.eventid = 2
 GROUP
    BY r.name;

答案 1 :(得分:0)

你有一个选择是使用这样的连接来编写子查询来获取工作电话和每个人的移动电话:

SELECT r.name, c.value AS workPhone
FROM registrations r
LEFT JOIN customFields c ON c.parentId = r.id AND c.customField = 'workphone';

通过使用左连接,如果一个人没有工作电话,这将返回null。请注意,如果用户有多个工作电话,这将无法正常工作,但我认为这个答案的目的不会发生。

您可以编写类似的查询来获取手机和国籍,一旦有了这些查询,您就可以一起加入查询以获取值。试试这个:

SELECT r.name, w.value AS workPhone, m.value AS mobile, n.value AS nationality
FROM registrations r
LEFT JOIN customFields w ON w.parentID = r.id AND w.customField = 'workphone'
LEFT JOIN customFields m ON m.parentID = r.id AND m.customField = 'mobile'
LEFT JOIN customFields n ON n.parentID = r.id AND n.customField = 'nationality';

以下是SQL Fiddle示例。

答案 2 :(得分:-1)

我更了解这个问题。实际上,正如@ McAdam331所回答的那样,一个解决方案就是设置3个左连接(每个自定义字段一个)