MySQL转换与替换

时间:2018-02-27 19:44:16

标签: mysql group-by pivot-table

我正在尝试从Forms插件中获取条目,并将结果重新格式化为更有用的前端查看格式。我相信我可以用一个支点做到这一点,但我无法从提供的示例中找到它。作为Side注释,datatbase包含来自多种不同表单的条目,因此我只能识别对查询很重要的field_id值。

当前数据格式

| entry-id | field_id |  slug  |  value  |
|   1      | fld_123  | First  |  Bob    |
|   1      | fld_234  | Last   | Smith   |
|   1      | fld_334  | Park   |Grand Can|
|   2      | fld_123  | First  | Mike    |
|   2      | fld_234  | Last   | Davis   |
|   2      | fld_334  | Park   |Grand Can|

我正在寻找的最终结果是:

|entry_ID  | First   |  Last  | park     
|  1       | Bob     | Smith  | Grand Can|
| 2        | Mike    | Davis  | Grand Can| 

请原谅我仍在解决的条目格式。

2 个答案:

答案 0 :(得分:0)

您可以像这样转动数据:

SELECT entry_id, 
  GROUP_CONCAT(IF(slug='First', value,'') SEPARATOR '') AS first,
  GROUP_CONCAT(IF(slug='Last', value,'') SEPARATOR '') AS last,
  GROUP_CONCAT(IF(slug='Park', value,'') SEPARATOR '') AS park 
FROM tablename
GROUP BY entry_id;

注意:如果slug条目未知,则它有点棘手,需要另一种类型的查询。在表格或列名称中使用连字符不是一个好主意,因此我在此示例中使用entry_id而不是entry-id

这里有sqlfiddle中的示例:http://sqlfiddle.com/#!9/a03165/1/0

如果需要按值查询,可以使用子查询:

SELECT * FROM (
  SELECT entry_id, field_id,
     GROUP_CONCAT(IF(slug='First', value,'') SEPARATOR '') AS first,
     GROUP_CONCAT(IF(slug='Last', value,'') SEPARATOR '') AS last,
     GROUP_CONCAT(IF(slug='Park', value,'') SEPARATOR '') AS park 
  FROM tablename
  GROUP BY entry_id) AS rows
WHERE first = '' OR park = '';

sqlfiddle:http://sqlfiddle.com/#!9/cef544/3/0

答案 1 :(得分:0)

迈克尔, 谢谢你的帮助,你的建议解决了我遇到的问题。这是我正在使用的实际查询。

SELECT entry_id,

GROUP_CONCAT(IF(field_id ='fld_5076430',value,'')SEPARATOR'')AS用户,

GROUP_CONCAT(IF(field_id ='fld_8768091',value,'')SEPARATOR'')AS首先,

GROUP_CONCAT(IF(field_id ='fld_9970286',value,'')SEPARATOR'')AS last,

GROUP_CONCAT(IF(field_id ='fld_6009157',value,'')SEPARATOR'')AS date,

GROUP_CONCAT(IF(field_id ='fld_5105414',value,'')SEPARATOR'')AS事件,

GROUP_CONCAT(IF(field_id ='fld_7723931',value,'')SEPARATOR'')AS单位,

GROUP_CONCAT(IF(field_id ='fld_1521970',value,'')SEPARATOR'')AS工作,

GROUP_CONCAT(IF(field_id ='fld_4590434',value,'')SEPARATOR'')AS小时

FROM kcdte_cf_form_entry_values

GROUP BY entry_id;