SELECT唯一值和关联的时间戳,而不使时间戳使事物独特

时间:2013-08-28 21:06:11

标签: mysql select join distinct

我为措辞不好的问题道歉。最好通过一个例子说明我到目前为止所得到的:

表“myInfo”包含列:

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

表“meta”包含列:

1. id (PK) 
2. metaName 
3. metaValue 
4. instanceNum 
“myInfo”表中的metaId与“meta”表中的instanceNum相关联。 “value”列的值有时会在metaId的不同行中发生变化。将metaId视为“meta”表中时间戳值的链接(“timestamp”,其值将分别进入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'; 

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

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

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

2 个答案:

答案 0 :(得分: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 

按查询分组只显示其中一个结果 - 但是哪个?你需要考虑订购一个团体(这是一个全新的球赛)

答案 1 :(得分: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 

使用最早的时间戳值,可以得到你想要的东西。