0

我为措辞不当的问题道歉。最好通过一个例子来说明,到目前为止我想出了什么:

表“myInfo”有列:

1. id (PK) 
2. key 
3. value 
4. metaId 

表“元”有列:

1. id (PK) 
2. metaName 
3. metaValue 
4. instanceNum 

“myInfo”表中的 metaId 与“meta”表中的 instanceNum 相关。“值”列的值有时会随着 metaId 在不同的行上发生变化。将 metaId 视为“元”表中时间戳值的链接(“时间戳”及其值将分别进入 metaName 和 metaValue 列)。

我想在“myInfo”中选择“value”列的不同值。到目前为止,我有:

SELECT DISTINCT mi.key, mi.value 
  FROM myInfo as mi JOIN metadata as meta 
 WHERE mi.metaId=meta.instanceNum 
   AND meta.key = 'timestamp' 
   AND mi.key='maxWeight'; 

但我也想要与这些值相关联的时间戳。所以我希望输出看起来像:

键值时间戳
最大重量 10 吨 2011-01-01 15:00:05
最大重量 5 吨 2011-10-12 08:00:07
最大重量 25 吨 2013-08-01 13:05:09

我不能将时间戳作为我的 SELECT 中的列之一,因为它也会返回重复的 mi.attrValue 值,因为时间戳使每一行都是唯一的。我尝试将 DISTINCT 关键字仅放在 mi.attrValue 后面,但出现 MySQL 错误。

4

2 回答 2

0

这是完全未经测试的,但通过 concat 分组可能有效。

SELECT mi.key, mi.value, meta.value
  FROM myInfo as mi JOIN metadata as meta ON mi.metaId = meta.id
 WHERE mi.key = 'maxWeight'
   AND meta.key = 'timestamp' 
 GROUP BY CONCAT(mi.key, mi.value)

尽管您仍然会遇到显示哪个时间戳的问题。例如,如果给定键/值对有 3 条记录,则结果集中将显示哪条记录?

key       value   timestamp 
maxWeight 10 tons 15:00:05 2011-01-01 
maxWeight 10 tons 08:00:07 2011-10-12 
maxWeight 10 tons 13:05:09 2013-08-01 

group by 查询将只显示其中一个结果 - 但哪个?您需要考虑订购一个小组(这是一个全新的球赛)

于 2013-08-29T12:41:56.613 回答
0
SELECT mi.key, mi.value, min(meta.value) 
  FROM myInfo as mi JOIN metadata as meta 
 WHERE mi.metaId=meta.instanceNum 
   AND meta.key = 'timestamp' 
   AND mi.key='maxWeight' 
 group by mi.key,mi.value 

会用最早的时间戳值得到你想要的。

于 2013-08-29T21:16:38.477 回答