返回共享一个共同值但是另一列必须匹配多个标准的行

时间:2013-05-20 17:08:20

标签: mysql sql

我有一个按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

2 个答案:

答案 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
       );

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