2013-05-05 142 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