SELECT kodeagent
, IFNULL((
SELECT COUNT(1)
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
AND bsn_data.kodeagent IN(
SELECT bsn_data.kodeagent
FROM bsn_data
WHERE bsn_data.periode LIKE '2018-12-%%'
AND bsn_data.kodeupline2 = bsn_kode_agent.kodeagent
GROUP BY bsn_data.kodeagent ORDER BY COUNT(1) DESC LIMIT 1
)
), 0) AS totps
FROM bsn_kode_agent
WHERE fungsi = 'sales agent'
ORDER BY totps DESC
得到结果
此版本的mariadb尚不支持“limit&in/all/any/some子查询”
我该怎么解决这个问题?我想在子查询中添加限制查询。。谢谢您。。
4条答案
按热度按时间c0vxltue1#
我认为这会奏效:
笔记:
不要对日期使用字符串操作!使用适当的日期操作。
使用表别名并限定表名。
=
可以使用limit
,尽管in
不能。COUNT()
不会再回来了NULL
,因此不需要NULL
比较。我仍然不认为查询会起作用,因为您有一个双重嵌套的correlation子句。但这确实解决了你眼前的问题。
如果这仍然不起作用,问另一个问题,提供示例数据、期望的结果,并解释您试图实现的逻辑。
5q4ezhmt2#
避免
IN ( SELECT ... )
在这种情况下,把它变成一个JOIN
.更改中间查询:
到
索引:
但是等等!难道不能简化为
bfnvny8b3#
mariadb提供了“窗口函数”,我认为可以利用这些函数来实现这一点(也提到了前面的问题,似乎只需要“前3位”代理的计数):
下面:如果单独运行子查询结果。注意它是
rn
列只允许后续筛选具有最高计数的代理。db<>在这里摆弄
另外请注意,有一些样本数据是多么有用,但由于没有提供,我可能对这里看到的样本做了不正确的假设-如果随问题一起提供样本数据总是更好的。
drnojrws4#
没有任何东西可以检查我的答案。请尝试此操作,将子查询 Package 到另一个中以提供tmp表别名(tmp\u bsn\u data):