我有两个相同查询的变体:
SELECT * FROM jos_mls AS mls
INNER JOIN jos_activeagents AS active ON mls.MSTLISTBRD = active.AGENTUID
INNER JOIN jos_agents AS agents ON active.AGENTUID = agents.AGTBRDIDMM
INNER JOIN jos_agencies AS firm on agents.AGTFRMID = firm.OFFFRMID
AND mls.MSTRECAPDT >= ADDTIME(CURRENT_TIMESTAMP(), '04:29:00.000000');
和...
SELECT * FROM jos_mls AS mls
INNER JOIN jos_activeagents AS active ON mls.MSTLISTBRD = active.AGENTUID
INNER JOIN jos_agents AS agents ON active.AGENTUID = agents.AGTBRDIDMM
INNER JOIN jos_agencies AS firm on agents.AGTFRMID = firm.OFFFRMID
AND mls.MSTMLSNO = '4115762';
第一个工作正常,没问题。第二个是根据唯一键找到一个条目。但是,它给出了一个空集。我可以验证密钥是否存在,当我运行第一个查询时,我知道该列已包含在集合中。
我试过用它和没有引号拉它,没有运气。有什么建议吗?
答案 0 :(得分:1)
首先,我怀疑你打算说WHERE
,而不是AND
; - )
SELECT * FROM jos_mls AS mls
INNER JOIN jos_activeagents AS active ON mls.MSTLISTBRD = active.AGENTUID
INNER JOIN jos_agents AS agents ON active.AGENTUID = agents.AGTBRDIDMM
INNER JOIN jos_agencies AS firm on agents.AGTFRMID = firm.OFFFRMID
WHERE mls.MSTMLSNO = 4115762
但是你写的是“有效的”(至少在一些DBMS中,我觉得在mysql中没问题)。但就你所追求的结果而言,可能并不“正确”。
(我对mySql并不是特别熟悉,但是相信某些DBMS在ON
子句中的表达式存在问题,这些表达式与JOIN
表格无关。但我的经验如此远离mySql,这是语法罚款)
在某些情况下,即使它“有效”(即它运行并产生某些结果而没有错误),该子句的位置将对结果集产生影响(我认为)以及查询优化(我很确定)。这些事情中的一件或两件都可能发生在这里?
无论是否“修复”了问题,恕我直言,除了可读性/可维护性之外,您应该将AND mls...
条款移至适当的ON
条款。
SELECT * FROM jos_mls AS mls
INNER JOIN jos_activeagents AS active
ON mls.MSTLISTBRD = active.AGENTUID
AND mls.MSTMLSNO = 4115762
INNER JOIN jos_agents AS agents ON active.AGENTUID = agents.AGTBRDIDMM
INNER JOIN jos_agencies AS firm on agents.AGTFRMID = firm.OFFFRMID;
答案 1 :(得分:0)
以下评论:
尝试时会发生什么:
SELECT * FROM jos_mls AS mls WHERE mls.MSTMLSNO = 4115762;
你得到任何结果吗?