2

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

我的(DB)结构非常简单:

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

我的目标是获取属于某个特定testcaseinstance的所有s 的最后 10 个testcasetestsuite

这是我用来获取所有 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;

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

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

提前致谢!

4

1 回答 1

0

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

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 |
+---+
于 2013-06-30T10:54:16.920 回答