【问题标题】:Limit a Left Join on the first table限制第一个表的左连接
【发布时间】:2012-11-23 08:53:39
【问题描述】:

我有两个表:gems 和 gemdetail 是左连接的。我试图将 LEFT JOIN 限制为 gems 表中的 10 条记录。还加入了 2 个其他表(gemreply 和 users),但它们不会导致问题。以下方法不起作用:

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,但由于每个 gem 有多个详细记录,我只剩下不到 10 个 gem 记录。我已经阅读了每个“限制”帖子,但没有发现这种情况。

更新 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 的代码也可以工作——可能是我要使用的代码。谢谢你们!

【问题讨论】:

  • 移动子查询内的限制?
  • 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME subquery' 是在子查询中发生的事情。
  • 好的,那么您想要记录前 10 个 gem 及其所有详细信息,然后与 gemreply 和用户一起加入或左加入吗?
  • 什么版本的 MySQL?如果您有限制,您可以将它们发布在问题中(并添加 MySQL 标签)吗?如果你不把一切都告诉别人,那么你怎么能期望你的问题得到一个合理的答案呢?
  • 这个查询一定会失败,因为在 FROM 子句的括号内应该有一个子查询。相反,它只列出表格。

标签: sql left-join limit


【解决方案1】:

类似的东西

   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)

【讨论】:

    【解决方案2】:

    试试这个:

    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;
    

    这应该可行。

    【讨论】:

    • 这也有效!我可能会选择这个——它读起来对我来说更好。我希望我可以将两个帖子都标记为答案(选中)。
    • 这很简单 - 接受对您最有用的答案:)
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2012-08-03
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多