我试图确定我的woltlab论坛中是否还有其他人使用与“ noname”相同的userAgent
(软件规格)。表中有成千上万的条目,许多条目是多次。因此,我正在使用DISTINCT
列出所有noname的userAgent。这本身工作正常。但是我想检查来自具有相同userAgent的其他用户的条目。
SELECT * FROM db_123456.wcf1_user_iplog
WHERE userAgent IN
(SELECT DISTINCT(userAgent)
FROM db_123456.wcf1_user_iplog
WHERE username = "noname"
)
AND username != "noname";
但是,这将导致无限循环。至少我认为这是一个,因为5万个条目可能不会导致执行时间超过120秒。
我使用过:MySQL Workbench和phpMyAdmin。
为什么不终止?
我能做什么?
最佳答案
MySQL通常对WHERE IN
的优化较差,并且对JOIN
的优化往往更好。
SELECT a.*
FROM db_123456.wcf1_user_iplog AS a
JOIN (SELECT DISTINCT userAgent
FROM db_123456.wcf1_user_iplog
WHERE username = "noname") AS b
ON a.userAgent = b.userAgent
AND a.username != "noname"
顺便说一句,
DISTINCT
不是函数,不需要在列名两边加上括号。关于mysql - 无休止的循环查询:选择WHERE IN(选择不重复…),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30742927/