我有一张表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}}命令并不熟悉,所以如果没有意义,请帮助我编辑我的问题。
答案 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")