我有一些奇怪的SQL查询问题。我正在使用MySQL,我会改变数据库结构,但我不能。所以我必须用查询来解决我的问题。
所以我有3张桌子。挑战,用户_挑战和用户订阅。我需要离开的地方3如下:
我需要列出所有挑战的列表.private = 0并且我必须排除当前用户ID(users_challenges.iduser = 414)下出现在Users_challenges中的所有挑战。 然后我需要挑战可以有challenge.private = 1或0,但它们列在第三个表(users_subscribed.iduser = 414)中,并且在这里我必须排除挑战表中的所有读取ID。 最后,我需要将所有结果统一起来,并按时间限制。
我希望我说得对,因为它至少对我而言非常困惑:D
我当前的查询需要26秒才能执行:
SELECT *
FROM challenges
WHERE challenges.private = 0
AND challenges.isquest = 1
AND challenges.title like '%%'
AND challenges.id NOT
IN (
SELECT users_challenges.idchallenge
FROM users_challenges
WHERE users_challenges.iduser = 414
AND users_challenges.idquest IS NULL
GROUP BY users_challenges.idchallenge
)
UNION
SELECT *
FROM challenges
WHERE challenges.isquest = 1
AND challenges.title like '%%'
AND challenges.iduser
IN (
SELECT users_subscriptions.idsubscribedto
FROM users_subscriptions
WHERE users_subscriptions.iduser = 414
UNION
SELECT 414 AS idsubscribedto
)
AND challenges.id NOT
IN (
SELECT users_challenges.idchallenge
FROM users_challenges
WHERE users_challenges.iduser
IN (
SELECT users_subscriptions.idsubscribedto
FROM users_subscriptions
WHERE users_subscriptions.iduser = 414
UNION
SELECT 414 AS idsubscribedto
)
AND users_challenges.idquest IS NULL
GROUP BY users_challenges.idchallenge
)
ORDER BY TIME DESC
LIMIT 0,30
那么有没有办法如何简化此查询并更快地获得相同的结果? THX
答案 0 :(得分:0)
如果and challenges.title like '%%'
不是一个错字,我会删除它作为第一步,因为它始终是真的。
根据Rewriting Subqueries as Joins,使用联接代替in (subquery)
可能会有所帮助。
您还可以单独运行这两个查询,以查看其中一个查询是否很慢。然后你可以专注于慢速部分并单独留下快速部分。