过滤列上具有列条件的行

时间:2014-11-13 22:23:51

标签: mysql sql dynamic-sql

我有一张表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

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

注意:我对{{1}}命令并不熟悉,所以如果没有意义,请帮助我编辑我的问题。

3 个答案:

答案 0 :(得分:4)

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。

答案 1 :(得分:1)

这是一种有点难看的方式:

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')

答案 2 :(得分:0)

SELECT 
  * 
FROM 
  `my_table` 
WHERE 
  `type` IN ("b","c")