【问题标题】:SQL query with limit on rows from one table, not the result setSQL 查询限制一个表中的行,而不是结果集
【发布时间】:2011-01-06 07:02:42
【问题描述】:

我正在运行一个带有连接的简单查询,类似于

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... LIMIT 5

由于t1t2 中有很多行(任何大于2 的数字),LIMIT 语句不会返回来自t1 的前5 行以及来自t2 的相应条目,而是5 行,通常包括2 -3 行来自t1

如何编写此查询以获取来自 t1 的前 5 行以及来自 t2 的相应条目?


使用 MySQL 5.0.45。

【问题讨论】:

    标签: sql mysql join limit


    【解决方案1】:

    我相信以下方法可以解决问题:

    SELECT t1.a, (SELECT t2.b FROM t2 WHERE t2... = t1...) AS b FROM t1 LIMIT 5
    

    【讨论】:

    • 感谢您的回答。由于 t2 中有多个对应于 t1 的条目,我得到ERROR 1242 (21000): Subquery returns more than 1 row
    【解决方案2】:
    SELECT t3.a, t2.b FROM (SELECT * FROM t1 LIMIT 5) t3
    LEFT JOIN t2 ON ...
    

    请注意,如果您使用没有“order by”子句的限制,则不会定义您将获得哪 5 行。如果这不是您想要的,请考虑添加“order by”子句。

    【讨论】:

    • 请注意,此解决方案存在 MySQL 的可扩展性问题,并且如果他希望在 t2 中按字段排序,则无法正常工作。
    • @hobodave 幸运的是,我 ORDER BY t1 中的一个字段。
    • @Robert:您可能会发现您需要应用两次 ORDER BY - 一次在内部查询中选择前五行,然后再次在外部查询中以确保返回结果相同的顺序。
    【解决方案3】:

    这是一个经典的分页查询。我建议将其分解为两个查询:

    SELECT DISTINCT t1.id FROM t1 LEFT JOIN t2 ON ... LIMIT 5
    

    获取这些 id 并将它们放在以下查询中:

    SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... WHERE t1.id IN (?,?,?,?,?) 
    

    【讨论】:

    • 感谢您的回答。最好使用 1-query 解决方案,并且已提供。
    • np,请注意派生表解决方案以及 SELECT * 的性能影响。
    • 这也是一个好点。现在派生表需要查看大约 8k 行,而且速度足够快。另外,我不会使用SELECT *
    【解决方案4】:

    您可以按 t1 中的唯一列对其进行分组:

    SELECT * FROM t1 JOIN t2 ON ... GROUP BY t1.id LIMIT 5
    

    但是您需要 t2 表按特定顺序排列吗?

    【讨论】:

    • 感谢您的回答。请看我的问题,我需要返回超过 5 行,它是来自 t2 的 10+ 行加上来自 t1 的 exactly 5 行。接受的答案有一个很好的解决方案。 hobodave 的也可以。
    • 啊是的 - 有道理,没有正确阅读问题。接受的答案效果很好。您也可以使用计算唯一行但会变得混乱的变量来做到这一点。
    猜你喜欢
    • 2019-07-14
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2011-03-24
    • 2011-07-14
    相关资源
    最近更新 更多