在我的第一张桌子上,信息最多。 可以在一段时间后填充第二张表,所以如果什么都没有,我将得到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,则必须排成一行
答案 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查询优化器的想法回馈了:)