如果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。或"办公室"。
有人可以告诉我,我做错了什么?
答案 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 BY
和integration
可能来自任意(匹配)行。但是,这不是你问题的主旨。