这就是我现在所拥有的。
SELECT distinct ClientID
FROM Table
WHERE PAmt = '' and ClientID not in
(select distinct ClientID from Table where PAmt != '')
ORDER BY ID ASC
ClientID可以在表内多次,其中一些有PAmt值,有些则没有。 我试图只获得从未有过PAmt值的clientid。该表有大约12000个条目,只有2700个是独特的clientid's
答案 0 :(得分:3)
我认为这可以通过
更容易解决SELECT
ClientID,
MAX(IF(PAmt='',0,1)) AS HasPAmt
FROM `Table`
GROUP BY ClientID
HAVING HasPAmt=0
修改强>
关于这背后的理由的一些说法:
MySQL中的子查询是一个令人讨厌的事情:如果结果集太大(原始SQL)或与驱动查询交织(@DavidFleeman的答案),则内部查询循环,即对于每行驱动重复查询。这个过程表现不佳。
因此我们尝试以某种方式重新构造查询,以避免循环。我的建议只运行两个查询:第一个(HAVING
之前的所有内容)将创建一个临时表,将每个不同的ClientID标记为至少有一个非空PAmt(或不是),第二个仅选择临时表中那些被标记为无的行进入最终结果集。
答案 1 :(得分:1)
尝试将您的查询重新组织为以下内容:
select clientID
from Table
group by clientID
having max(length(PAmt)) == 0
当然你应该添加索引(clientID,PAmt)
如果此查询仍然运行缓慢,请添加具有预先计算长度的列,并将PAmt替换为此列
答案 2 :(得分:0)
尝试使用not exists而不是in。
答案 3 :(得分:0)
拿走子查询:
$clientIds = runQuery("select distinct ClientID from Table where PAmt != ''");
$clientIds = implode(",", $clientIds);
runQuery("SELECT distinct ClientID
FROM Table
WHERE PAmt = '' and ClientID not in
({$clientIds})
ORDER BY ID ASC")
我知道MySQL应该为你做优化步骤,但事实并非如此。如果您将子查询作为单独的查询执行,您会发现查询的速度提高了大约12000倍。