【问题标题】:Filter for rows with column condition on an array在数组上过滤具有列条件的行
【发布时间】:2023-03-04 19:44:01
【问题描述】:

我有一张桌子my_table

id  x_id type
--- ---- ----
1    31   a
2    14   b
3    31   c
4    12   c
5    31   b
6    12   c
7    14   a

我想返回x_id 具有type 的所有行满足数组arr 中的所有元素。

编辑:但是,该数组中的实际值及其数量未知,但可能是列type 的值。 arr 中总是至少有一个值。

所以对于arr = [b, c],我应该得到以下结果:

id  x_id type
--- ---- ----
3    31   c
5    31   b

如何编写查询以获得这样的结果?

注意:我对sql 命令不是很熟悉,所以如果没有意义,请帮我编辑我的问题。

【问题讨论】:

  • 你能解释一下你在结果集中获得 31 作为 X_id 的标准吗?
  • @developer 31 因为至少有两行 x_id=31 代表 type=btype=c
  • @Julio 您是说数组中的项目数(当前为 2)有时可能是 3,有时可能是 4,等等?如果是这样,您如何确定数组中的哪些项目是感兴趣的?换句话说,是什么让 b 和 c 成为感兴趣的数组的一部分?如果没有一致的逻辑来确定,那么我相信您所描述的内容需要动态 sql(而不仅仅是普通的标准 sql)。
  • @BrianDeMilia 是的,数组中值的数量可以是任何值,或者至少会有一个值(我应该提一下)。我将添加动态 sql 标签。在上面的示例中,我使用 b 和 c 来说明我的示例,它可能是 [a][a,b,c],甚至是 [d,e,f,g]。但是,当我以 [a,b] 为例时,我期望 x_id=31
  • @Julio 出于什么原因(从业务逻辑上讲)是 [a,b,c] 与 [d,e,f,g] ?什么决定了数组中有哪些项目?

标签: mysql sql dynamic-sql


【解决方案1】:
select *
  from my_table
 where x_id in (select x.x_id
                  from (select x_id from my_table where type = 'b') x
                  join (select x_id from my_table where type = 'c') y
                    on x.x_id = y.x_id)
   and type in ('b', 'c')

小提琴测试: http://sqlfiddle.com/#!2/f8601/2/0

这可能更符合变量(有一个变量来保存 'b'、'c' 格式的类型列表和另一个变量来保存类型的计数。有什么办法可以让一个变量保存数组中的值是什么:'b','c'

select *
  from my_table
 where x_id in (select x_id
                  from my_table
                 where type in ('b', 'c')
                 group by x_id
                having count(distinct type) = 2)
   and type in ('b', 'c')

小提琴: http://sqlfiddle.com/#!2/f8601/12/0

因此,您将使用 2 个type in () 点中的变量(() 内的变量)和保存计数的变量来代替 2。

【讨论】:

    【解决方案2】:

    这是一个有点丑陋的方法:

    SELECT * FROM my_table
    WHERE x_id IN
    (
        SELECT x_id FROM
        (
            SELECT x_id, type
            FROM my_table x
            WHERE type IN ('b', 'c')
            GROUP BY x_id, type
        ) y
        GROUP BY x_id
        HAVING COUNT(x_id) = 2
    ) AND type IN ('b', 'c')
    

    【讨论】:

      【解决方案3】:
      SELECT 
        * 
      FROM 
        `my_table` 
      WHERE 
        `type` IN ("b","c")
      

      【讨论】:

      • 这将给出b和c的所有类型,他想要每个类型的顶部
      猜你喜欢
      • 1970-01-01
      • 2019-10-25
      • 2022-01-19
      • 2021-07-05
      • 2021-04-08
      • 2019-03-02
      • 1970-01-01
      • 2021-07-02
      • 2018-06-06
      相关资源
      最近更新 更多