2012-11-23 26 views
7

我有兩張桌子:左側連接的寶石和寶石。我試圖將LEFT JOIN限制爲寶石表中的10條記錄。還有另外兩個表(gemreply和用戶),但它們不會導致問題。以下不工作:限制第一張桌子上的左側加入

SELECT gems.gemid, gems.title, r.tot, gemdetail.filename FROM ((gems 
LEFT JOIN (SELECT gemid, COUNT(*) AS tot FROM gemreply GROUP BY gemid) AS r ON gems.gemid = r.gemid) 
LEFT JOIN gemdetail ON gems.gemid = gemdetail.gemid) 
LEFT JOIN users ON gems.userid = users.userid 
WHERE gems.grade = '7' ORDER BY gems.gemid LIMIT 0, 10; 

這限制了返回的行總數達到10,但因爲有每個寶石多個詳細記錄,我只剩下不到10分寶石的記錄。我已經閱讀過每一篇「LIMIT」文章,但還沒有發現這種情況。

更新1: 好的 - 感謝jviladrich - 它的工作。下面的代碼:

SELECT gems.gemid, gems.title, r.tot, gemdetail.filename 
FROM ((gems 
INNER JOIN (SELECT gems.gemid from gems WHERE gems.grade = '7' ORDER BY gems.gemid LIMIT 0, 10) g 
ON (gems.gemid = g.gemid) 
LEFT JOIN (SELECT gemid, COUNT(*) AS tot FROM gemreply GROUP BY gemid) AS r ON gems.gemid = r.gemid) 
LEFT JOIN gemdetail ON gems.gemid = gemdetail.gemid) 
LEFT JOIN users ON gems.userid = users.userid ; 

更新2: 從yogeshr下面的代碼也適用 - 可能是一個我會走。感謝你們倆!

+0

移動子查詢內的限制? – Ben

+0

這個版本的MySQL尚不支持子查詢內發生的「LIMIT&IN/ALL/ANY/SOME子查詢」。 – mseifert

+0

好的,那麼你想要記錄前10個寶石和他們的所有細節,然後加入或左 - 與gemreply和用戶加入? – Rachcha

回答

6

類似的東西

SELECT * FROM A 
     INNER JOIN (SELECT * FROM A WHERE A.FIELD1='X' ORDER BY A.FIELD2 LIMIT 10) X 
      ON (A.KEYFIELD=X.KEYFIELD) 
     LEFT JOIN B ON (A.FIELD = B.FIELD) 
     LEFT JOIN C ON (A.FIELD = C.FIELD) 
4

試試這個:

SELECT g.gemid, g.title, r.tot, gemdetail.filename 
FROM (SELECT * FROM gems WHERE grade = '7' LIMIT 10) g 
LEFT JOIN (SELECT gemid, COUNT(*) AS tot FROM gemreply GROUP BY gemid) r 
      ON r.gemid = g.gemid 
LEFT JOIN gemdetail ON g.gemid = gemdetail.gemid 
LEFT JOIN users ON g.userid = users.userid 
ORDER BY g.gemid; 

這應該工作。

+0

這也適用!我可能會用這個 - 這對我來說更好。我希望我可以將這兩個帖子標記爲答案(選中)。 – mseifert

+0

很簡單 - 接受對你最有用的答案:) – Rachcha

相關問題