2013-05-05 141 views
0

我有一个像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 '我有错误的结果,因为查询给了我正确的行加上属于订阅和阻止用户的行。 'LIMIT'如何改变结果?

编辑:有uid = 3的用户有另外2个用户订阅,用户5和6,并且用户6被阻止,所以我需要只显示来自用户5的消息,但与'限制30'消息用户6也被返回。

+3

你能提供一个SQL小提琴的例子(www.sqlfiddle.com)吗?或者至少要有样本数据和期望的结果。 – sgeddes 2013-05-05 01:06:57

+0

运行你自己的子查询。它是否返回至少1个'NULL'? – 2013-05-05 01:51:59

回答

0

这里只是一个猜测,但我发现自己想知道限制子句是否也应用于子查询,基本上只阻止Blocks表中的前30位作者。

尝试重构查询以避免使用子查询。

作为奖励,当您开始添加更多的数据时,您将消除performance problems inherent in the subquery implementation in MySQL

+0

即使'LIMIT'子句也应用于子查询,'WHERE'子句的限制只应返回正确的结果。我曾试图在没有子查询的情况下做到这一点,但它不起作用,除了我的老师说,当我向他展示没有查询的查询时,应该用子查询。有人知道如何在没有子查询的情况下做到这一点吗?我不在乎这个特定情况下的表现,尽管我知道相邻的问题。 – 2013-05-05 01:12:48