【问题标题】:MySQL select unique row entries of a column as columns in a new view or tableMySQL 选择列的唯一行条目作为新视图或表中的列
【发布时间】:2013-04-30 22:09:29
【问题描述】:

我有一个难题。我正在使用一个 CMS,它创建一个数据库表,其中记录填充如下:

+------------+----------------+
| field_name |  field_value   |
+------------+----------------+
| your-name  | Adam           |
| your-email | adam@email.com |
| your-name  | Ben            |
| your-email | en@email.com   |
+------------+----------------+

其中 field_name 和 field_value 是列名。此外,'your-name' 和 'your-email' 是网页中表单的输入名称。

(还有其他列,但它们都没有唯一的行条目)

我的问题是,我如何创建一个表或视图,以便我可以从上面的表中得到这个?

+-----------+----------------+
| your-name |   your-email   |
+-----------+----------------+
| Adam      | Adam@email.com |
| Ben       | Ben@email.com  |
+-----------+----------------+

我曾考虑过创建视图并加入它们,但我似乎无法让它发挥作用。

有什么想法可以实现吗?

谢谢!

【问题讨论】:

  • 对不起,必须添加这个:没有唯一的id

标签: mysql select join union


【解决方案1】:

您的表中有 ID 吗?如果你有,你可以使用这个:

SELECT
  MAX(CASE WHEN field_name='your-name' THEN field_value END) your_name,
  MAX(CASE WHEN field_name='your-email' THEN field_value END) your_email
FROM
  yourtable
GROUP BY
  id

请看小提琴here

【讨论】:

  • @echo_me 没有 ID 无法回答,但我想必须有 ID
  • 是的,这就是这张桌子没有 id 的东西。有点奇怪。但没有透露它是流行 CMS 的流行插件。
  • @NepzeTyson 如果没有 id 会很奇怪......但是有什么东西可以用来订购你的行吗?如果可以使用 ORDER BY 对行进行排序,则可能有替代解决方案,否则我认为不可能
  • 好吧,如果只关注我的目标,其中一部分是过滤掉来自同一 IP 地址的表单输入,我也许可以做到这一点?
【解决方案2】:

您的表 1 没有这样的 id 列吗(因此 (id, field_name) 是该表的主键)?

+----+------------+----------------+
| id | field_name |  field_value   |
+----+------------+----------------+
| 1  | your-name  | Adam           |
| 1  | your-email | adam@email.com |
| 2  | your-name  | Ben            |
| 2  | your-email | en@email.com   |
+----+------------+----------------+

那你可以做...

SELECT DISTINCT myTableAlias.id,
    (SELECT field_value FROM table
     WHERE id=myTableAlias.id AND field_name = 'your-name') your-name,
    (SELECT field_value FROM table
     WHERE id=myTableAlias.id AND field_name = 'your-email') your-email,
FROM table myTableAlias

【讨论】:

  • 不,不幸的是,在这方面它是一个设计不佳的数据库。它没有唯一的 id。
  • 您确定没有id 字段或类似的字段吗?考虑到关系数据库系统不保证行顺序,你怎么能断定电子邮件地址adam@email.com属于用户Adam!?
  • 看到这很奇怪。它没有。今晚我会再次检查是否有类似于 id 的东西。现在,通过 id,您的意思是递增的正确吗?
  • 通过 id,我的意思是将 your-name 行与 your-email 行相关联。或者我可以说: id 我的意思是一个列,因此 (id, field_name) 是一个唯一的键。请看我上面的表格。
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多