这可能是一个相当直接的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列表,但按“年份”排序?
注意:我正在处理遗留项目,因此我无法进行架构更改。
答案 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的输出插入表中。对不起,我没有在这里给出确切的语法,但希望方向有所帮助。