我有两张桌子A&乙
A :
id
data
B :
key
value
A_id
我的sql查询有问题(很难解释,所以我创建了一个sqlfiddle)
SELECT A.id
FROM A
INNER JOIN B b1 ON b1.key = '20' AND b1.A_id = A.id
INNER JOIN B b2 ON b2.key = '18' AND b2.A_id = A.id
WHERE
b1.value = '1900' AND
b2.value >= '1900'
在这个例子中,我应该得到(A.id = 12& A.id = 13)但没有
CREATE TABLE A
(`id` int, `data` int)
;
INSERT INTO A
(`id`, `data`)
VALUES
(11, 11),
(12, 11),
(13, 12)
;
CREATE TABLE B
(`key` int, `value` int, `A_id` int)
;
INSERT INTO B
(`key`, `value`, `A_id`)
VALUES
(20, 1900, 12),
(2, 19, 11),
(11, 19, 11),
(9, 19, 11),
(18, 1950, 13),
(19, 1950, 12)
;
有什么想法吗?
谢谢
答案 0 :(得分:3)
首先,如果你的代码超过10分钟,你将学会鄙视“不工作”这句话......“不工作”是不起作用的短语。
/咆哮
您正在尝试连接表以尝试过滤。而是相应地过滤。看看这个:
SELECT A.id
FROM A
INNER JOIN B b1 ON b1.A_id = A.id
WHERE
(b1.key = '20' AND b1.value = '1900')
OR
(b1.key = '18' AND b1.value >= '1900')
询问你想要什么,并在必要时加入。
答案 1 :(得分:2)
INNER JOIN
表示只有在两个表中都存在结果时才会返回结果。由于你内部每次使用唯一ID连接同一个表两次,你将永远不会得到这三个结果的结果(表A内连接B内连接b)。
我建议不同的东西:
SELECT A.id
FROM A
INNER JOIN B on A.id = B.A_id
WHERE
(B.id = '20' AND B.value = '1980') OR (B.id = '18' AND B.value >= '1990')
;
答案 2 :(得分:2)
您的查询对两个连接使用相同的A.id - 因此这意味着它们在返回的行上必须相同。对于b2.key = 18
,b2.A_id
13 ,而b1.key = 20
强制b1.A_id
12 。所以你想得到b1.A_id = b2.A_id
的回报,其中一个是12而另一个是13.如果你将查询改为
SELECT A.id
FROM A
INNER JOIN B b1 ON b1.key = '20' AND b1.A_id = A.id
INNER JOIN B b2 ON b2.key = '19' AND b2.A_id = A.id
WHERE
b1.value = '1900' AND
b2.value >= '1900'
你将获得A.id的回报。