我有像twitter这样拥有用户和消息的数据库,用户可以订阅和阻止其他用户。我需要显示未被阻止的订阅用户的消息,所以我有这样的查询:
SELECT DISTINCT M.mid, M.author, M.content FROM Msgs M, Subs S, Blocks B
WHERE S.uid = 3 AND S.sub_uid = M.author AND B.uid = 3 AND M.author NOT IN
(SELECT B2.bl_uid FROM Blocks B2 WHERE B2.uid = 3)
ORDER BY M.mid DESC LIMIT 30;
没有'LIMIT 30',查询工作正常,只给我正确的行,但是'LIMIT 30'我的结果有误,因为查询给了我正确的行以及属于订阅和阻止的用户的行。如何“限制”改变结果?
编辑:拥有uid = 3的用户有另外2个用户订阅,用户5和6,用户6被阻止,所以我只需要显示来自用户5的消息,但是'LIMIT 30'来自用户的消息6也被退回。答案 0 :(得分:0)
这里只是猜测,但我发现自己想知道限制子句是否也应用于子查询,基本上只阻止Blocks
表中的前30位作者。
尝试重构查询以避免使用子查询。
作为奖励,当您开始添加的不仅仅是一些小数据时,您将消除performance problems inherent in the subquery implementation in MySQL。