我试图确定我的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/

10-16 23:58