提取与一组值匹配的行,并且id计数与该组值的长度匹配

时间:2016-11-07 10:36:16

标签: mysql sql

我有一张这样的表

id|v
----
ab|1
ab|2
yz|1
yz|2
yz|3

如果在输入中我有(1,2)(2,1) - >我想提取id ab

如果在输入中我有(1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1) - >我想提取id yz

任何其他输入 - >没有

编辑: 输入来自另一个表。它可以在1列表中(即使在数组中也可以)。示例:

v     or    v   or  ...
-           -
1           3
2           2
            1

由于

3 个答案:

答案 0 :(得分:0)

如果将输入值作为数组传递,则可以使用group_concat函数。像这样:

select t.id from (
select id, group_concat(v separator ',') as v_grouped
from temp 
group by id ) as t
where t.v_grouped = group_concat(input separator ',')

答案 1 :(得分:0)

  1. SO让我很难在代码部分中使用多个 count(*),因此我将其替换为 count(1)
  2. select  *
    from    my_table as t
    where   (select count(1) from my_table t2 where t2.id = t.id) = (select count(1) from my_input)
    ;
    
    1. 如果所有数字都是连续的,没有重复或缺少值,则输入可以是表示行数的单个数字,并且实际上不需要具有所有值的表。
    2. set @number_of_rows := 3;
      
      select  *
      from    my_table as t
      where   (select count(1) from my_table t2 where t2.id = t.id) = @number_of_rows
      ;
      

答案 2 :(得分:0)

您说您有一个现有查询,为您提供要在表格中查找的值。所以结果可能如下所示:

value
2
1

您正在寻找表中具有这些值的ID,不多也不少,没有不同的ID。因此,您希望将可以表示的值集匹配为一组经过排序的逗号分隔值,即'1,2''1,2,3'等。

因此,唯一的任务是构建这些字符串(使用GROUP_CONCAT)并比较:

select id
from mytable
group by id
having group_concat(v order by v) in
(
  select group_concat(value order by value)
  from your_existing_query
);

如果要显示找到的ID的记录:

select *
from mytable
where id in
(
  select id
  from mytable
  group by id
  having group_concat(v order by v) in
  (
    select group_concat(value order by value)
    from your_existing_query
  )
);