我有一个按ID和值按降序排序的表。我想返回按特定顺序匹配一组键的所有id。所以给定(a5,a3)我想返回 a 和 b ,但不是 d 。
id value key
a 3 a5
a 2 a3
a 1 a4
b 4 a5
b 2 a3
c 6 a1
c 2 a2
d 4 a3
d 2 a5
预期输出为
id
a
b
到目前为止,我已经设法匹配(a5,a3),但任何顺序。在这里,我将以任何顺序返回所有匹配的行和字段;不只是id。
SELECT tablename.*
FROM tablename, (SELECT * FROM tablename a
WHERE key IN ('a5', 'a3')
GROUP BY id
HAVING COUNT(*) >= 1) AS result
WHERE tablename.id = result.id
答案 0 :(得分:1)
为此,您可以使用以下查询 -
select distinct t_1.ID from tablname t_1, tablename t_2
where t_1.id = t_2.id
and t_1.key = 'a5' and t_2.key = 'a3'
and t_1.value > t_2.value
答案 1 :(得分:1)
这是set-within-sets查询的一个示例,尽管它比大多数都要复杂一些。
select id
from tablename t
group by id
having (max(case when "key" = 'a5' then value end) >
max(case when "key" = 'a3' then value end)
);
这样做是为了找到“a5”和“a3”的值并直接比较它们。如果两者都不存在,那么max(case . . .)
将返回NULL并且比较将失败。如果两个(或两个)都有多个值,则返回最大值。
通过添加更多类似的子句,这应该很容易推广到特定顺序的其他键。这就是为什么我喜欢使用having
方法对这种查询进行聚合的原因 - 它适用于很多情况。
对于你提到的“无中间”案例,我认为这样可行:
select id
from (select t.*, @rn := @rn + 1 as seqnum
from tablename t cross join (select @rn := 0) const
order by key, value
) t
group by id
having (max(case when "key" = 'a5' then seqnum end) = max(case when "key" = 'a3' then seqnum end) + 1
);
附加一个序列号,然后检查它们是否是连续的两个值。