2016-12-16 123 views
-2

我将这些数据存储在Mysql 5数据库的表中。如何从几个名称/值字段中获取Mysql中的字段

表数据

| attrName | attrValue    | 
----------------------------------------- 
| price  | 12.23     | 
| current_p | 23.99     | 
| price_dev | 0.1222     | 
| timestamp | 2009-07-14 00:00:00 EDT | 
| price  | 14.23     | 
| current_p | 13.11     | 
| price_dev | 0.7444     | 
| timestamp | 2009-07-14 00:01:00 EDT | 
| price  | 11.00     | 
| current_p | 18.55     | 
| price_dev | 0.3572     | 
| timestamp | 2009-07-14 00:02:00 EDT | 

现在我想要做一个查询以这种方式(通过时间戳顺序)显示所有数据

| timestamp    | price | current_p | price_dev | 
------------------------------------------------------------- 
| 2009-07-14 00:00:00 EDT | 12.23 | 23.99  | 0.1222 | 
| 2009-07-14 00:01:00 EDT | 14.23 | 13.11  | 0.7444 | 
| 2009-07-14 00:02:00 EDT | 11.00 | 18.55  | 0.3572 | 

你可以建议我正确的查询?

非常感谢,

pasquy73

+1

做一个'select'语句,你用'CASE'语句解析'attrValue'列(确定它将在哪个列下)多次''作为你的新列名称 – Abdul

+0

[Here](http: /stackoverflow.com/questions/26909661/how-to-split-a-column-into-multiple-columns-ordered-by-date)是一个非常类似的问题 – Abdul

+0

如果这是一个合适的[EAV数据模型](https: //en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model),应该有一个实体表将某个实体相互关联。否则,您如何知道应将哪些属性分组为单行结果? –

回答

0

你似乎是依靠行的表中的顺序来确定属性的“组”上。

但是在SQL中,表中的行没有隐式顺序或位置,您只能按某个值列对行进行排序或分组。

所以你必须添加一个列到他们交往:

| eventId | attrName | attrValue    | 
------------------------------------------------- 
| 1234 | price  | 12.23     | 
| 1234 | current_p | 23.99     | 
| 1234 | price_dev | 0.1222     | 
| 1234 | timestamp | 2009-07-14 00:00:00 EDT | 
| 1235 | price  | 14.23     | 
| 1235 | current_p | 13.11     | 
| 1235 | price_dev | 0.7444     | 
| 1235 | timestamp | 2009-07-14 00:01:00 EDT | 
| 1236 | price  | 11.00     | 
| 1236 | current_p | 18.55     | 
| 1236 | price_dev | 0.3572     | 
| 1236 | timestamp | 2009-07-14 00:02:00 EDT | 

然后你可以使用不同的解决方案,这充分证明在标签下的其他地方。

例如:

SELECT eventId, 
    MAX(CASE attrName WHEN 'timestamp' THEN attrValue END) as timestamp, 
    MAX(CASE attrName WHEN 'price' THEN attrValue END) as price, 
    MAX(CASE attrName WHEN 'current_p' THEN attrValue END) as current_p, 
    MAX(CASE attrName WHEN 'price_dev' THEN attrValue END) as price_dev, 
FROM WhateverMyTableNameIs 
GROUP BY eventid 

如果你不想这样做,那么你就必须以不同存储你的数据,把属性在适当的列,而不是这个键值的设计。

+0

发表评论感谢大家和Bill,我已经用Bill的解决方案解决了这个问题 – pasquy73

+0

幸运的是我有一个recTime参数(如eventId)。 – pasquy73

相关问题