【问题标题】:MySQL: limit query or subquery (in left/inner join?)MySQL:限制查询或子查询(在左/内连接中?)
【发布时间】:2023-03-02 21:31:01
【问题描述】:

提前道歉,我是 (My)SQL 的新手——这对于专业的 DBA 来说应该是一个简单的问题——但我什至不知道从哪里开始寻找解决方案。我什至不确定我是否以下面的正确方式应用了 LEFT JOIN。

我的(DB)结构很简单:

我有testsuites,并且有几个testcases 链接到每个testsuite(“逻辑实体”) 在测试用例启动期间,我为testsuiteinstance 表中的每个testsuite 创建一个条目,并在testcaseinstance 中为每个testcase 创建一个条目。

我的目标是获取属于某个testsuite的所有testcases中的最后10个testcaseinstances

这是我用来获取 all testcaseinstances:

的查询
SELECT * FROM testcaseinstance AS tcinst
LEFT JOIN testsuiteinstance tsinst ON tsinst.id=tcinst.testsuiteinstance_id
LEFT JOIN testsuite ts ON ts.id=tsinst.testsuite_id
WHERE ts.id = 349 ORDER BY tcinst.id DESC;

所以,假设我在 testsuite 中有两个 testcases,并且两个 testcase 都被执行了 100 次。这个查询给了我 200 行。如果我把“LIMIT 10”放在最后,我只会得到一个testcase类型的最后10行,但我想要20行(最后10-10属于两个testcases)

我会感谢解决方案查询旁边的一些描述或指向“教程”的指针,我可以开始查看与该主题相关的内容(无论是什么:D)

提前致谢!

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    这是一种方法;考虑这个(稍微做作的)例子......

    SELECT * FROM ints;
    
    +---+
    | i |
    +---+
    | 0 |
    | 1 |
    | 2 |
    | 3 |
    | 4 |
    | 5 |
    | 6 |
    | 7 |
    | 8 |
    | 9 |
    +---+
    

    假设我们要返回此列表中前 3 个偶数和前 3 个奇数。暂时忽略这个特定示例还有另一个更简单的解决方案,我们可以改为执行类似的操作...

    SELECT x.*
         , COUNT(*) rank 
      FROM ints x 
      JOIN ints y 
        ON MOD(y.i,2) = MOD(x.i,2) 
       AND y.i >= x.i 
     GROUP 
        BY i 
     ORDER 
        BY MOD(x.i,2) DESC
         , x.i DESC;
    +---+------+
    | i | rank |
    +---+------+
    | 9 |    1 |
    | 7 |    2 |
    | 5 |    3 |
    | 3 |    4 |
    | 1 |    5 |
    | 8 |    1 |
    | 6 |    2 |
    | 4 |    3 |
    | 2 |    4 |
    | 0 |    5 |
    +---+------+
    

    从这里开始,从每个组中仅获取前 3 名的过程变得微不足道...

    SELECT x.*
         , COUNT(*) rank 
      FROM ints x 
      JOIN ints y 
        ON MOD(y.i,2) = MOD(x.i,2) 
       AND y.i >= x.i 
     GROUP 
        BY i 
    HAVING rank <=3 
     ORDER 
        BY MOD(x.i,2),x.i DESC;
    +---+------+
    | i | rank |
    +---+------+
    | 8 |    1 |
    | 6 |    2 |
    | 4 |    3 |
    | 9 |    1 |
    | 7 |    2 |
    | 5 |    3 |
    +---+------+
    

    ...这可以简化为...

    SELECT x.*
      FROM ints x 
      JOIN ints y 
        ON MOD(y.i,2) = MOD(x.i,2) 
       AND y.i >= x.i 
     GROUP 
        BY i 
    HAVING COUNT(*) <=3;
    
    +---+
    | i |
    +---+
    | 4 |
    | 5 |
    | 6 |
    | 7 |
    | 8 |
    | 9 |
    +---+
    

    【讨论】:

    • 嗯,他们确实说美在旁观者的眼中。
    • 好吧,如果是你的帖子,它可以only在那里:D
    猜你喜欢
    • 2013-11-02
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2021-02-10
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多