2012-11-23 30 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

相关问题