2014-01-06 43 views
0
SELECT * FROM 
MobileApps as dtable 
WHERE (SELECT COUNT(*) as c 
     FROM app_details 
     WHERE trackId=dtable.SourceID)=0 
ORDER BY id ASC 
LIMIT 0,2 

問題是說第一兩個結果由ID排序是在app_details,所以COUNT(*)犯規」等於0的第2個結果。但是MobileApps表中有更多的結果等於0.查詢邏輯,錯期望的結果的MySQL

我認爲它會先SELECT * FROM app_details WHERE trackId=dtable.SourceID)=0然後ORDER BY id ASC LIMIT 0,2,而不是相反,有什麼可能的方式來解決它?

感謝

+0

它正常工作對我來說:http://www.sqlfiddle.com/#!2/536db/1 – Barmar

+0

聞起來像一個流產'...不存在(SELECT ...)...'我。問:你想從沒有app_details的移動應用程序中獲取所有內容,對嗎? –

回答

1

您的查詢工作,但是更好的方式來寫它:

SELECT dtable.* 
FROM MobileApps dtable 
LEFT JOIN app_details d ON d.trackId = dtable.SourceID 
WHERE d.trackId IS NULL 
ORDER BY dtable.id 
LIMIT 0, 2 

或:

SELECT * 
From MobileApps dtable 
WHERE NOT EXISTS (SELECT * 
        FROM app_details d 
        WHERE d.trackId = dtable.SourceID) 
ORDER BY id 
LIMIT 0, 2 

查看所有3個版本在這裏:http://www.sqlfiddle.com/#!2/536db/2

對於一個大型表格,你可能應該對它們進行基準測試,看看哪一個MySQL優化zes最好。

+0

我更喜歡第二種選擇,如果這是OP的任務,則更加緊湊和清晰。 –