在非结构化表中过滤一个值,但按另一个值排序

时间:2013-12-30 04:03:34

标签: mysql sql

这可能是一个相当直接的SQL查询,但我之前没有做太多的SQL /数据库查询,并且继承了我正在努力理解和正确描述的问题(因此模糊的标题...... )

USER META
======================================
  id  |  user_id  |  field  |  value
======================================    
   1  |     1     |  color  |  red
   2  |     1     |  year   |  1923
   3  |     1     |  ...    |  ...
   4  |     3     |  color  |  purple
   5  |     3     |  year   |  2013
   6  |     3     |  ...    |  ...    
   7  |     7     |  color  |  red
   8  |     7     |  year   |  1982
   9  |     7     |  ...    |  ...

鉴于我的表格结构如上例所示,我如何查询按特定“颜色”过滤的user_id列表,但按“年份”排序?

注意:我正在处理遗留项目,因此我无法进行架构更改。

3 个答案:

答案 0 :(得分:2)

你可以自我加入:

SELECT DISTINCT t1.user_id
FROM TableName t1
JOIN TableName t2 ON t1.user_id = t2.user_id
WHERE t1.field = 'color' AND t1.value = 'red' AND t2.field = 'year'
ORDER BY t2.value

答案 1 :(得分:1)

一种方法是聚合:

select user_id
from usermeta
group by user_id
having sum((case when field = 'color' then value end) = 'purple') > 0
order by max(case when field = 'year' then value+0 end);

having子句计算满足特定条件的行数,并确保给定user_id至少有一行。

order by正在回归年份。 +0只是将其转换为数值,因此可以正确排序。年份存储为字符串。 (对于一年来,这可能并不重要,因为大概都是四位数,但对于其他数字,它可能很重要。)

答案 2 :(得分:0)

我认为一个解决方案是动态创建临时表,一个包含user_id和color列,另一个包含user_id和year的列,基于此表,然后对它们进行连接。即使你找到一个语法上复合的单一语句解决方案,它内部也必须做类似的事情。

可以根据select的输出插入表中。对不起,我没有在这里给出确切的语法,但希望方向有所帮助。