我如何在mysql中使用左连接

时间:2015-12-16 11:18:42

标签: mysql sql select join

如果where子句没有填满,我不希望查询选择任何内容,但也许我错过了一些东西。以下是我正在使用的查询

SELECT one.id_user, integration, data
FROM tableOne one
LEFT JOIN tableTwo two ON two.id_user = one.id_user
AND two.integration IN ('office', 'Office')
WHERE one.state='NEW' OR one.state='PAUSED'
AND two.integration IN ('office', 'Office')
GROUP BY one.id_user

将记录插入到所需的表中,并进行集成" SomeValue"而不是" office"或" Office"这意味着where claus不应该是true,查询不应返回任何内容,但确实如此。它返回id_user和其余字段为null。

但如果整合不是"办公室"我甚至不选择id_user。或"办公室"。

有人可以告诉我,我做错了什么?

4 个答案:

答案 0 :(得分:1)

试试这个:

SELECT one.id_user, integration, data
FROM tableOne ONE
INNER JOIN tableTwo two ON two.id_user = one.id_user
WHERE one.state IN ('NEW', 'PAUSED') AND two.integration IN ('office', 'Office')
GROUP BY one.id_user;

答案 1 :(得分:1)

从我看到你做了2个错误的假设。

第一个是sql语句不是左连接。听起来很奇怪。这背后的原因是你在where语句中使用通过左连接连接的第二个表。这会将整个左连接转换为内部形式。

第二个假设是

one.state='NEW' OR one.state='PAUSED' AND two.integration IN ('office', 'Office')
如果two.integration不是(O)办公室,

不会显示任何内容。并且更强大,因为你有<或p>

(one.state='NEW') OR (one.state='PAUSED' AND two.integration IN ('office', 'Office')) 

因此,如果state是NEW,那么积分具有什么价值并不重要。 你应该纠正这个:

((one.state='NEW') OR one.state='PAUSED') AND two.integration IN ('office', 'Office')

在那里获得理想的结果。

然后你仍然遇到内连接和左连接的问题。实质上你必须将two.integration部分移动到左连接部分,如果你真的想要一个左连接(你的问题描述听起来不像)。如果你想要一个内连接,你应该重命名连接部分并将所有where部分放在内连接的部分:

            SELECT one.id_user, integration, data
            FROM tableOne one
            INNER JOIN tableTwo two ON two.id_user = one.id_user
            AND two.integration IN ('office', 'Office')
            AND (one.state='NEW' OR one.state='PAUSED')
            GROUP BY one.id_user

答案 2 :(得分:0)

首先,LEFT JOIN是一个外部联接,即使右表中没有匹配项,也会保留左表中的记录。那么当你只想要比赛时,你为什么要使用呢?将其设为INNER JOIN(或简称为JOIN)。

然后,当混合AND和OR时使用括号:

one.state='NEW' OR one.state='PAUSED' AND two.integration IN ('office', 'Office')

装置

one.state='NEW' OR (one.state='PAUSED' AND two.integration IN ('office', 'Office'))

你想要它的意思

(one.state='NEW' OR one.state='PAUSED') AND two.integration IN ('office', 'Office')

propably。

答案 3 :(得分:0)

您的price-filter-range条款正在将where转变为left join。为什么?因为值为inner join时,two上的条件将失败。

所以,你的意图可能是:

NULL

无需在SELECT one.id_user, integration, data FROM tableOne one LEFT JOIN tableTwo two ON two.id_user = one.id_user AND two.integration IN ('office', 'Office') WHERE one.state IN ('NEW', 'PAUSED') GROUP BY one.id_user; where子句中重复过滤条件 - 事实上,它会为此查询生成不正确的结果。

此外,on可能会导致其他问题,因为GROUP BYintegration可能来自任意(匹配)行。但是,这不是你问题的主旨。