0

我有一个按 id 和 value 降序排序的表。我想以特定顺序返回与一组键匹配的所有 id。所以给定 (a5, a3) 我想返回ab但不是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),但顺序不限。在这里,我将返回以任何顺序匹配的所有行和字段;不仅仅是身份证。

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
4

2 回答 2

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
于 2013-05-20T17:24:47.027 回答
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
       );

附加一个序列号,然后检查它们对于您的两个值是否连续。

于 2013-05-20T18:03:39.653 回答