Mysql多个内连接不起作用

时间:2014-06-14 21:35:43

标签: mysql sql inner-join

我有两张桌子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)
;

有什么想法吗?

谢谢

3 个答案:

答案 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 = 18b2.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的回报。