Table A: Table A_B: Table B:
id | a a_id | b_id id | b
------ ----------- ------
1 | w 1 | 1 1 | s
2 | x 1 | 2 2 | t
3 | y 2 | 4 3 | u
4 | z 4 | 4 4 | v
现在我想从表A WHERE B.id = 1 AND B.id = 2获得所有条目。
目前我必须遵循以下代码:
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
在这里我被困住了。 WHERE b.id IN (...)
为我提供了表A WHERE b.id = 1 OR b.id = 2
当然的所有条目,而WHERE b.id = 1 AND b.id = 2
根本没有给出任何结果......
我发现唯一可行的解决方案是使用INTERSECT
:
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
WHERE b.id = 1
INTERSECT
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
WHERE b.id = 2
但我可以拥有无数的b.ids。所以这个查询会变得很慢......
是不是像IN
那样表现得像我想要的?它应该使用Criteria Query实现:
Join<A, B> aB = root.join(A_.bs); // as this is a @ManyToMany relationship
...
但我也对纯SQL解决方案感到满意。
答案 0 :(得分:1)
在MySQL上测试:
select TableA.id, count(*)
from tableA
join tableA_B on TableA.id=TableA_B.a_id
where b_id =1 or b_id=2
group by tableA.id
having count(*)=2
答案 1 :(得分:0)
我必须承认我并没有真正关注问题和问题,但是你是说这不起作用:
SELECT *
FROM B b
LEFT JOIN A_B ab ON b.id = ab.b_id
LEFT JOIN A a ON ab.a_id = a.id
WHERE b.id IN (1,2)
答案 2 :(得分:0)
据我了解,这是一个多对多关系,您希望根据表B
上的Id过滤数据。
首先,你的第一个查询对我来说似乎没问题;为清楚起见,我会写如下:
select
a.id, a.a, b.id, b.b
from
A as a
inner join A_B as ab on a.id = ab.a_id
inner join B as b on ab.b_id = b.id;
现在,如果您想要b.id = 1
或 b.id = 2
的所有记录,这应该有效:
select
a.id, a.a, b.id, b.b
from
A as a
inner join A_B as ab on a.id = ab.a_id
inner join B as b on ab.b_id = b.id
where
b.id in (1,2);
希望这有帮助