如果第二个表中为空,则MySQL连接查询结果

时间:2018-12-24 13:06:24

标签: mysql

在我的第一张桌子上,信息最多。 可以在一段时间后填充第二张表,所以如果什么都没有,我将得到NULL或0或在case.opened中返回值。但是,如果在cases表中没有使用该用户ID的内容,我不知道如何使用WHERE子句“ AND cases.opened = 0”来处理...

那是我的查询

SELECT offers.case_id, offers.trade_id, offers.state, offers.amount, cases.opened FROM offers INNER JOIN cases ON offers.trade_id = cases.trade_id WHERE offers.user = '+pool.escape(userid)+' AND cases.opened = 0

因此从该用户打开0的情况下可能什么也没有,但是如果什么都没有,我会得到一些回馈:/

现在,如果案件为空,我什么也得不到。但是,如果有什么情况,我会得到正确的信息。

如果没有任何帮助,请帮助我如何还找回东西

多亏了答案,我发现这行之有效!

SELECT offers.case_id, offers.trade_id, offers.state, offers.amount, cases.opened FROM offers LEFT JOIN cases ON offers.trade_id = cases.trade_id WHERE offers.user = '+pool.escape(opskinsid)+' AND offers.state = 9 OR offers.user = '+pool.escape(opskinsid)+' AND offers.state = 3 AND cases.opened = 0

但是它加载时间非常长...大约14-18秒... 我的第一个查询时间不到0.5秒...

任何想法为何? :/

在最后一个查询中,我检查offer中的状态是否为9,而不是返回结果,或者状态为3,则打开的状态为0等等。 原因是如果报价中的状态为3,则必须排成一行

3 个答案:

答案 0 :(得分:0)

如果您使用左联接,即使右表中没有匹配的行,在任何情况下都将返回左表中的行。

SELECT offers.case_id,
       offers.trade_id,
       offers.state,
       offers.amount,
       cases.opened
       FROM offers
            LEFT JOIN cases
                      ON offers.trade_id = cases.trade_id
       WHERE offers.user = '+pool.escape(userid)+'

答案 1 :(得分:0)

这是您要测试的offer.user的一个非常奇怪的文字。没关系。

您要使用外部联接:

SELECT offers.case_id, offers.trade_id, offers.state, offers.amount,
       ifnull(cases.opened, 0) as opened
FROM offers OUTER JOIN cases ON offers.trade_id = cases.trade_id AND cases.opened = 0
WHERE offers.user = '+pool.escape(userid)+'

答案 2 :(得分:0)

找到了解决方案

SELECT
    * 
FROM
    ((SELECT
        offers.case_id,
        offers.trade_id,
        offers.state,
        offers.amount,
        cases.opened 
    FROM
        offers 
    INNER JOIN
        cases 
            ON offers.trade_id = cases.trade_id 
    WHERE
        offers.user = '+userid+' 
        AND offers.state = 3 
        AND cases.opened = 0) 
UNION
DISTINCT (SELECT
    offers.case_id,
    offers.trade_id,
    offers.state,
    offers.amount,
    cases.opened 
FROM
    offers 
LEFT JOIN
    cases 
        ON offers.trade_id = cases.trade_id 
WHERE
    offers.user = '+userid+' 
    AND offers.state = 9)
) AS union1

那现在工作非常快:)

感谢@sticky位 他对mysql查询优化器的想法回馈了:)