【问题标题】:Extract rows that match a set of values and the id count matches to the length of that set of values提取与一组值匹配的行,并且 id 计数与该组值的长度匹配
【发布时间】:2016-11-07 10:36:15
【问题描述】:

我有一张这样的桌子

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) i> 或 (2,3,1)(3​​,1,2)(3​​,2,1) -> I想提取id yz

任何其他输入 -> 没有

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

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

谢谢

【问题讨论】:

  • 假设 (id,v) 的每个组合都是唯一的,这里有一些事情要做:SELECT *, v IN (1,2) x FROM my_table; 提示:现在哪些行的 SUM 等于 COUNT ?
  • 如果输入中有 (1,3) ,它应该提取什么?
  • 如果在输入中我有 (1,3) -> 什么都没有
  • 如果输入中有 (1,2,2,3) ,它应该提取什么?
  • 如果在输入中我有 (1,2,2,3) -> 什么都没有

标签: mysql sql


【解决方案1】:

如果您将输入值作为数组传递,您可以使用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 ',')

【讨论】:

  • 你能解释得更好吗?
  • 首先按id('ab', 'yz' 值)对行进行分组,以获得应匹配的v 值。然后group_concat 函数将值连接到以逗号分隔的字符串。此查询的结果在主查询的from 子句中用于过滤数据。
  • 什么是输入?谢谢
  • “输入”是指您要用于查找 id 的值(即 1、2、3)。在您的情况下,是另一个查询的结果。您可以添加排序以确保连接的输入和v_groupedis 相同。
【解决方案2】:
  1. SO 让我很难在代码部分使用多个 count(*),因此我将其替换为 count(1)

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. 如果所有数字都是连续的,没有重复或缺失值,则输入可能是表示行数的单个数字,并且实际上不需要包含所有值的表。

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
;

【讨论】:

    【解决方案3】:

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

    价值 2 1

    您正在表中寻找具有这些值的 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
      )
    );
    

    【讨论】:

    • 很好。非常感谢! ;)
    猜你喜欢
    • 2014-03-27
    • 2018-10-17
    • 2018-02-22
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多